最近我意识到,由于疏忽大意,我用 Raku 编写的一个类是这样的:
class Foo {
has method bar {
return 'some string';
}
}
我惊讶地意识到 has 方法
并不是一个错误,并按预期工作。
在这种情况下, has
的作用是什么? 这是有意为之的行为吗?
has
是一个作用域指示符,与 my
、our
、state
和 anon
等同类。使用 has
作用域声明的东西会被安装在当前包的元类中。
变量式的东西总是需要用显式作用域声明,例如:
my $lexical-var;
my $.lexical-var-with-accessor;
has $!attribute;
has $.attribute-with-accessor;
许多其他结构可以选择性地指定其作用域,但都具有合理的默认值。例如:
my sub marine() { }
- 没有my
时相同our class Struggle { }
- 没有our
时相同has method in-the-madness() { }
- 没有has
时相同方法最常见的替代作用域可能是anon
,这在元编程时很有用。例如,如果我们正在编写一个使用MOP构造另一个类的类,我们可以编写:
$the-class.^add_method('name', anon method name() { $name });
这意味着我们不会在当前类中安装方法name
。然而,大多数情况下,我们希望使用has
范围。明确指定它并没有什么害处,就像在sub
之前写my
一样;这只是重申一个默认值。