问题描述
最近我意识到我完全是错误地编写了这样的Raku类之一:
class Foo {
has method bar {
return 'some string';
}
}
我惊讶地发现has method
不是错误,并且按预期工作。
在这种情况下,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
范围。显式指定它无害,就像在my
之前写sub
一样无害;只是重申默认设置。