最近我意识到我完全错误地编写了这样的 Raku 类之一:
class Foo {
has method bar {
return 'some string';
}
}
Run Code Online (Sandbox Code Playgroud)
我很惊讶地发现这has method不是错误,并且按预期工作。
has在这种情况下做什么?这是故意行为吗?
Jon*_*ton 13
has是一个作用域声明符,与my, our, state, 和属于同一类别anon。has-scoped 的东西安装在当前包的元类中。
类似变量的东西总是用明确的范围声明,例如:
my $lexical-var;
my $.lexical-var-with-accessor;
has $!attribute;
has $.attribute-with-accessor;
Run Code Online (Sandbox Code Playgroud)
许多其他构造可以选择指定其范围,但带有合理的默认值。例如:
my sub marine() { } - 和没有一样 myour class Struggle { } - 和没有一样 ourhas method in-the-madness() { } - 和没有一样 has方法最常见的替代范围可能是anon,这在元编程时很有用。例如,如果我们正在编写一个要使用 MOP 构造另一个类的类,我们可以这样写:
$the-class.^add_method('name', anon method name() { $name });
Run Code Online (Sandbox Code Playgroud)
这意味着我们最终不会将方法name安装在我们所在的当前类中。然而,大多数时候,我们想要has范围。明确指定没有坏处,就像my之前写没有坏处一样sub;它只是重申默认值。