class Metamodel::DefiniteHOW
        does Metamodel::Documenting
            { }

警告:此类是 Rakudo 实现的一部分,不属于语言规范。

类型对象可以赋予一个类型笑脸,这是一个表示其确定性的后缀

say Any:D.^name# OUTPUT: «Any:D␤» 
say Any:U.^name# OUTPUT: «Any:U␤» 
say Any:_.^name# OUTPUT: «Any␤» 

尽管与 Any 共享一个类型,但 Any:UAny:D 特别具有不同的类型检查行为

say Any ~~ Any:D;     # OUTPUT: «False␤» 
say Any ~~ Any:U;     # OUTPUT: «True␤» 
say Any ~~ Any:_;     # OUTPUT: «True␤» 
say Any.new ~~ Any:D# OUTPUT: «True␤» 
say Any.new ~~ Any:U# OUTPUT: «False␤» 
say Any.new ~~ Any:_# OUTPUT: «True␤» 

这是因为 Any:DAny:U 不是使用 Metamodel::ClassHOW 创建的,就像您可能期望 Any 类型对象一样,而是使用 Metamodel::DefiniteHOW 创建的。此 HOW 定义了这些确定类型对象的的行为。

以下类型声明

my Any constant Definite = Any:D;

大致等效于使用 Metamodel::DefiniteHOW 方法的以下代码

my Any constant Definite = Metamodel::DefiniteHOW.new_type: base_type => Anydefinite => 1;

方法§

方法 new_type§

method new_type(:$base_type!:$definite!)

给定基本类型和确定性,创建一个新的确定类型。$definite 应为 :D 类型的 1:U 类型的 0

方法 name§

method name($definite_type)

返回确定类型的名称。

方法 shortname§

method shortname($definite_type)

返回确定类型的简称。

方法 base_type§

method base_type($definite_type)

返回确定类型的基本类型

say Any:D.^base_type.^name# OUTPUT: «Any␤» 

方法 definite§

method definite($definite_type)

如果给定的确定类型是 :D 类型,则返回 1,如果是 :U 类型,则返回 0

方法 nominalize§

method nominalize($obj)

为确定类型生成一个名义类型对象。这是其基本类型,如果它具有 nominalizable 原型,它也可能被名义化。

方法 find_method§

method find_method($definite_type$name)

在确定类型的基本类型上查找方法。

方法 type_check§

method type_check($definite_type$checkee)

对确定类型执行针对 $checkee 的类型检查。这将检查 $checkee 是否为其基本类型,如果匹配则返回 True,否则返回 False。例如,当确定类型位于 smartmatch 的左侧时,可以调用此元方法。

方法 accepts_type§

method accepts_type($definite_type$checkee)

$checkee 执行针对确定类型的类型检查。这将检查 $checkee 是否为其基本类型并匹配其确定性,如果匹配则返回 True,否则返回 False。例如,当确定类型位于 smartmatch 的右侧时,可以调用此元方法。