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

问题描述

最近我意识到我完全是错误地编写了这样的Raku类之一:

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

我惊讶地发现has method不是错误,并且按预期工作。

在这种情况下,has在做什么?这是故意的行为吗?

解决方法

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范围。显式指定它无害,就像在my之前写sub一样无害;只是重申默认设置。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...