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
是一个范围声明符,与 my
、our
、state
和 anon
之类的东西属于同一类别。 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”关键字是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章