如果我有一个公共方法,我可以使用$.name
和self.name
在其类中调用它:
class TEST {
has Int $.a;
method b($x) {
return $!a * $x;
}
method c($y) {
return self.b($y) * 3; # or $.b($y)
}
}
my $m = TEST.new(a => 10);
say $m.c(2); # 60
但如果我将b
作为私有方法,我只能使用self!b
而不是$!b
来调用它,否则会收到以下错误消息:
Attribute $!b not declared in class TEST
这条规则背后的原因是什么?在自己的类中调用方法的规则是什么?
答案 0 :(得分:10)
属性在类中始终可以称为$!foo
。如果你这样做,那么生成的代码将直接访问属性本身,并且任何继承类的类将不能够改变这种行为。
如果在类的声明中使用has $.foo
,则表示公共访问器(如果添加is rw
,它也可以用作变异器)。
如果您在代码中使用$.foo
,则其与<{1}}完全相同。这意味着它将在$( self.foo )
上调用方法foo
,并逐项列出返回值(将其设为单个&#34;&#34;如果还没有)。如果您使用self
定义属性并且自己没有提供$!foo
,则会出错。
这更进一步:method foo
实际上意味着$.bar
:您只需要一个名称为self.bar
的方法,这可能与任何属性都无关。< / p>
如果您定义私有方法bar
,则!baz
仅表示方法的隐私,这意味着您需要将其称为!
。它有 no 短语法。
我个人不喜欢即使self!baz
不是属性也可以说$.zippo
的事实。但是我担心这艘船已经航行了。但是这种行为现在让你感到困惑: - (
因此,如果没有用于调用私有方法的短语法,那么规则背后的原因是什么?不确定,我认为zippo
已经被认为意味着直接访问该属性,并且如果该属性不存在,则会为您提供编译时错误。
希望这能回答你的问题!