在类型系统中§
有关trait does的更多信息,请参阅主要文档在上下文中
trait does
可以应用于角色和类,提供编译时混合。要引用尚未定义的角色,请使用前向声明。混合角色的类的类型名称不会反映混合,类型检查会反映。如果在多个混合角色中提供了方法,则首先定义的方法优先。可以提供用逗号分隔的角色列表。在这种情况下,将在编译时报告冲突。
;does R2 ;;does R1 ;say [C ~~ R1, C ~~ R2];# OUTPUT: «[True True]»
在运算符中§
有关infix does的更多信息,请参阅主要文档在上下文中
sub infix:<does>(Mu , Mu ) is assoc<non>
在运行时将$role
混合到$obj
中。要求$obj
是可变的。
类似于but运算符,如果$role
只提供一个属性,则可以在括号中传递一个初始化器。
类似于but运算符,$role
可以是一个实例化对象,在这种情况下,运算符将自动为你创建一个角色。该角色将包含一个与$obj.^name
同名的单一方法,并返回$obj
my = class .new;put ; # OUTPUT: «original»does "modded";put ; # OUTPUT: «modded»
如果已经存在同名方法,则最后混合的角色优先。
在 Mu 中§
有关routine does的更多信息,请参阅主要文档在上下文中
method does(Mu --> Bool)
当且仅当调用者符合类型$type
时,返回True
。
my = Date.new('2016-06-03');say .does(Dateish); # OUTPUT: «True» (Date does role Dateish)say .does(Any); # OUTPUT: «True» (Date is a subclass of Any)say .does(DateTime); # OUTPUT: «False» (Date is not a subclass of DateTime)
与只为超类返回True
的isa
不同,does
包括超类和角色。
say .isa(Dateish); # OUTPUT: «False»
使用智能匹配运算符~~是一种更习惯的替代方案。
my = Date.new('2016-06-03');say ~~ Dateish; # OUTPUT: «True»say ~~ Any; # OUTPUT: «True»say ~~ DateTime; # OUTPUT: «False»