在 Raku 中,*traits*是附加到对象和类的编译器钩子,它们修改了类和对象的默认行为,功能或表示。作为这样的编译器钩子,它们是在编译时定义的,尽管它们可以用于运行时。
通过使用 trait_mod
关键字,已经将几个 traits 定义为语言或 Rakudo 编译器的一部分。接下来列出并解释它们。
定义为
proto sub trait_mod:<is>(Mu $, |) {*}
is
适用于任何类型的标量对象,并且可以接收任意数量的命名参数或位置参数。它是最常用的 trait,取决于第一个参数的类型,采用以下形式。
最常见的形式涉及两个类,一个正在定义,另一个现有,定义为 defines parenthood。 A is B
, 如果两个都是类,则将 A 定义为 B 的子类。
is DEPRECATED
可以应用于类,属性或例程,将它们标记为已弃用并发出警告消息(如果提供了的话)。
is
的几个实例被直接转换为它们引用的类的属性:rw
,nativesize
,ctype
,unsigned
,hidden
,array_type
。
不可实例化的表示 trait 与表示没有多大关系,与特定类可以做什么有关; 它有效地防止以任何可能的方式创建类的实例。
constant @IMM = <Innie Minnie Moe>;
class don't-instantiate is repr('Uninstantiable') {
my $.counter;
method imm () {
return @IMM[ $.counter++ mod @IMM.elems ];
}
}
say don't-instantiate.imm for ^10;
不能实例化的类仍然可以通过它们的类变量和方法使用, 如上所示。尝试这样: my $do-instantiate = don’t-instantiate.new;
来实例化它们会产生错误。