在 Raku 类定义中,“方法”之前的“has”关键字是什么意思?

jja*_*jja 9 syntax raku

最近我意识到我完全错误地编写了这样的 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, 和属于同一类别anonhas-scoped 的东西安装在当前包的元类中。

类似变量的东西总是用明确的范围声明,例如:

my $lexical-var;
my $.lexical-var-with-accessor;
has $!attribute;
has $.attribute-with-accessor;
Run Code Online (Sandbox Code Playgroud)

许多其他构造可以选择指定其范围,但带有合理的默认值。例如:

  • 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 });
Run Code Online (Sandbox Code Playgroud)

这意味着我们最终不会将方法name安装在我们所在的当前类中。然而,大多数时候,我们想要has范围。明确指定没有坏处,就像my之前写没有坏处一样sub;它只是重申默认值。

  • 喜欢这些例子:-) (3认同)