在 Perl 6 的 class 中使用 public 和私有方法

Using public and private methods inside their class in Perl 6

如果我有一个 public 方法,我可以使用 $.nameself.name 在其 class 中调用它:

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

这条规则的背后是什么?在其自身内部调用方法的规则是什么 class?

属性总是可以在 class 中被称为 $!foo。如果这样做,将生成直接访问属性本身的代码,并且任何 classes subclassing 您的 class 将 not 能够改变这种行为。

如果你在 class 的声明中使用 has $.foo,这意味着 public 访问器(如果你添加 is rw 它也可以用作突变体)。

当您在代码中使用 $.foo 时,它 $( self.foo ) 完全相同。这意味着它将在 self 上调用方法 foo,并逐项列出 return 值(如果还没有,则将其设为单个 "thing")。如果您使用 $!foo 定义属性并且您自己没有提供 method foo,这将出错。

这更进一步:$.bar 真正意味着 self.bar:您只需要有一个名为 bar 的方法,它可能与任何属性根本无关.

如果你定义一个私有方法!baz!只是表示该方法的私有性,这意味着你确实需要调用它self!baz没有它的简短语法。

我个人不喜欢你可以说 $.zippo,即使 zippo 不是一个属性。但恐怕那艘船已经启航了。但是这种行为现在让你感到困惑:-(

那么,在调用私有方法时没有简短语法的规则背后是什么?不确定,我猜 $!foo 已经被认为是直接访问该属性的意思,如果该属性不存在,则会为您提供编译时错误。

希望这能回答您的问题!