在类型系统中§

有关trait does的更多信息,请参阅主要文档在上下文中

trait does可以应用于角色和类,提供编译时混合。要引用尚未定义的角色,请使用前向声明。混合角色的类的类型名称不会反映混合,类型检查会反映。如果在多个混合角色中提供了方法,则首先定义的方法优先。可以提供用逗号分隔的角色列表。在这种情况下,将在编译时报告冲突。

role R2 {...};
role R1 does R2 {};
role R2 {};
class C does R1 {};
 
say [C ~~ R1C ~~ R2];
# OUTPUT: «[True True]␤»

有关运行时混合,请参阅butdoes

在运算符中§

有关infix does的更多信息,请参阅主要文档在上下文中

sub infix:<does>(Mu $objMu $roleis assoc<non>

在运行时将$role混合到$obj中。要求$obj是可变的。

类似于but运算符,如果$role只提供一个属性,则可以在括号中传递一个初始化器。

类似于but运算符,$role可以是一个实例化对象,在这种情况下,运算符将自动为你创建一个角色。该角色将包含一个与$obj.^name同名的单一方法,并返回$obj

my $o = class { method Str { "original" } }.new;
put $o;            # OUTPUT: «original␤» 
$o does "modded";
put $o;            # OUTPUT: «modded␤»

如果已经存在同名方法,则最后混合的角色优先。

在 Mu 中§

有关routine does的更多信息,请参阅主要文档在上下文中

method does(Mu $type --> Bool:D)

当且仅当调用者符合类型$type时,返回True

my $d = Date.new('2016-06-03');
say $d.does(Dateish);             # OUTPUT: «True␤»    (Date does role Dateish) 
say $d.does(Any);                 # OUTPUT: «True␤»    (Date is a subclass of Any) 
say $d.does(DateTime);            # OUTPUT: «False␤»   (Date is not a subclass of DateTime) 

与只为超类返回Trueisa不同,does包括超类和角色。

say $d.isa(Dateish); # OUTPUT: «False␤» 

使用智能匹配运算符~~是一种更习惯的替代方案。

my $d = Date.new('2016-06-03');
say $d ~~ Dateish;                # OUTPUT: «True␤» 
say $d ~~ Any;                    # OUTPUT: «True␤» 
say $d ~~ DateTime;               # OUTPUT: «False␤»