如果我有一个公共方法,我可以使用它们在类中调用它 $.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
这个规则背后的原因是什么?在自己的类中调用方法的规则是什么?
属性总是可以称为 $!foo 在课堂上。如果你这样做,那么生成的代码将直接访问属性本身,并且任何继承类的类都会 不 能够改变这种行为。
如果你使用 has $.foo 在一个类的声明中,它意味着一个公共访问器(如果你添加 is rw 它也可以作为一个变异器)。
当你使用 $.foo 在你的代码中,否则就是 究竟 同样的 $( self.foo )。这意味着它将调用该方法 foo 上 self,并逐项列出返回值(如果还没有,则将其作为单个“事物”)。如果您使用定义属性,则会出错 $!foo 而且你没有提供 method foo 你自己。
这甚至更进一步: $.bar 真正意思 self.bar:您只需要有一个名称存在的方法 bar,可能与任何属性都没有关系。
如果您定义私有方法 !baz, ! 只是表明方法的隐私,这意味着你需要将其称为 self!baz。有 没有 它的简短语法。
我个人不喜欢你可以说的事实 $.zippo 即使 zippo 不是属性。但我担心这艘船已驶过。但这种行为现在引起你的困惑:-(
那么,为了调用私有方法没有简短的语法规则背后的原因是什么?不确定,我想是的 $!foo 已经被认为是指对属性的直接访问,如果该属性不存在,则会为您提供编译时错误。
希望这能回答你的问题!