在词汇表中§

有关角色,请参阅主要文档 上下文

角色、混入或特征定义接口和/或这些接口的实现,以及使用它们的实例变量,并在声明遵循该接口的类时进行混入。抽象类 是角色的特定示例,其中实际实现被推迟到使用该角色的类。

角色是 Raku 的对象系统的一部分,并使用role关键字声明,并通过does在类声明中使用。

在面向对象中§

有关角色,请参阅主要文档 上下文

角色是属性和方法的集合;但是,与类不同,角色只用于描述对象行为的一部分;这就是为什么通常角色旨在混入类和对象中的原因。通常,类用于管理对象,而角色用于管理对象中的行为和代码重用。

角色使用关键字 role 放在所声明角色的名称之前。使用 does 关键字混入角色,该关键字放在所混入角色的名称之前。

还可以使用 is 将角色混入类。但是,is 与角色的语义与 does 提供的语义有很大不同。使用 is,可以从角色中双关类,然后从该类继承。因此,没有扁平化组合,也没有 does 提供的任何安全性。

constant ⲧ = " " xx 4#Just a ⲧab 
role Notable {
    has Str $.notes is rw;
 
    multi method notes() { "$!notes\n" };
    multi method notesStr $note ) { $!notes ~= "$note\n" ~ ⲧ };
 
}
 
class Journey does Notable {
    has $.origin;
    has $.destination;
    has @.travelers;
 
    method Str { "⤷ $!origin\n" ~ ⲧ ~ self.notes() ~ "$!destination ⤶\n" };
}
 
my $trip = Journey.new:origin<Here>:destination<There>,
                        travelers => <þor Freya> );
 
$trip.notes("First steps");
notes $trip: "Almost there";
print $trip;
# OUTPUT: 
#⤷ Here 
#       First steps 
#       Almost there 
# 
#There ⤶ 

一旦编译器解析了角色声明的结束花括号,角色就会变得不可变。