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

Posted

技术标签:

【中文标题】Raku 类定义中“方法”之前的“has”关键字是啥意思?【英文标题】:What does the "has" keyword mean before "method" in a Raku class definition?Raku 类定义中“方法”之前的“has”关键字是什么意思? 【发布时间】:2020-09-21 19:41:39 【问题描述】:

最近我意识到我完全错误地写了一个这样的 Raku 课程:

class Foo 
  has method bar 
    return 'some string';
  

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

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

【问题讨论】:

【参考方案1】:

has 是一个范围声明符,与 myourstateanon 之类的东西属于同一类别。 has-scoped 的东西安装在当前包的元类中。

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

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 也没有害处;它只是重申一个默认值。

【讨论】:

喜欢这些例子:-)

以上是关于Raku 类定义中“方法”之前的“has”关键字是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

Perl 之父同意 Perl 6 改名为 Raku

php--在类中声明常量的关键字

MacOS 上的 Raku Comma IDE 无法启动

在属性类名称之前的C#中使用了什么是new关键字?

java中为啥要把main方法定义为一个static方法

10.25下午 静态