在Perl 6中使用其类中的公共和私有方法

时间:2018-04-22 20:40:07

标签: perl6

如果我有一个公共方法,我可以使用$.nameself.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

这条规则背后的原因是什么?在自己的类中调用方法的规则是什么?

1 个答案:

答案 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已经被认为意味着直接访问该属性,并且如果该属性不存在,则会为您提供编译时错误。

希望这能回答你的问题!