在Raku类定义中,"has"关键字在"method"之前是什么意思?

10

最近我意识到,由于疏忽大意,我用 Raku 编写的一个类是这样的:

class Foo {
  has method bar {
    return 'some string';
  }
}

我惊讶地意识到 has 方法并不是一个错误,并按预期工作。

在这种情况下, has 的作用是什么? 这是有意为之的行为吗?

1个回答

14

has 是一个作用域指示符,与 myourstateanon 等同类。使用 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一样;这只是重申一个默认值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接