does Metamodel::Documenting
警告:此类是 Rakudo 实现的一部分,不属于语言规范。
类型对象可以赋予一个类型笑脸,这是一个表示其确定性的后缀
say Any.^name; # OUTPUT: «Any:D»say Any.^name; # OUTPUT: «Any:U»say Any.^name; # OUTPUT: «Any»
尽管与 Any
共享一个类型,但 Any:U
和 Any:D
特别具有不同的类型检查行为
say Any ~~ Any; # OUTPUT: «False»say Any ~~ Any; # OUTPUT: «True»say Any ~~ Any; # OUTPUT: «True»say Any.new ~~ Any; # OUTPUT: «True»say Any.new ~~ Any; # OUTPUT: «False»say Any.new ~~ Any; # OUTPUT: «True»
这是因为 Any:D
和 Any:U
不是使用 Metamodel::ClassHOW
创建的,就像您可能期望 Any
类型对象一样,而是使用 Metamodel::DefiniteHOW
创建的。此 HOW 定义了这些确定类型对象的的行为。
以下类型声明
my Any constant Definite = Any;
大致等效于使用 Metamodel::DefiniteHOW
方法的以下代码
my Any constant Definite = Metamodel::DefiniteHOW.new_type: base_type => Any, definite => 1;
方法§
方法 new_type§
method new_type(:!, :!)
给定基本类型和确定性,创建一个新的确定类型。$definite
应为 :D
类型的 1
或 :U
类型的 0
。
方法 name§
method name()
返回确定类型的名称。
方法 shortname§
method shortname()
返回确定类型的简称。
方法 base_type§
method base_type()
返回确定类型的基本类型
say Any.^base_type.^name; # OUTPUT: «Any»
方法 definite§
method definite()
如果给定的确定类型是 :D
类型,则返回 1
,如果是 :U
类型,则返回 0
。
方法 nominalize§
method nominalize()
为确定类型生成一个名义类型对象。这是其基本类型,如果它具有 nominalizable
原型,它也可能被名义化。
方法 find_method§
method find_method(, )
在确定类型的基本类型上查找方法。
方法 type_check§
method type_check(, )
对确定类型执行针对 $checkee
的类型检查。这将检查 $checkee
是否为其基本类型,如果匹配则返回 True
,否则返回 False
。例如,当确定类型位于 smartmatch 的左侧时,可以调用此元方法。
方法 accepts_type§
method accepts_type(, )
对 $checkee
执行针对确定类型的类型检查。这将检查 $checkee
是否为其基本类型并匹配其确定性,如果匹配则返回 True
,否则返回 False
。例如,当确定类型位于 smartmatch 的右侧时,可以调用此元方法。