在 Perl 6 的 class 中使用 public 和私有方法
Using public and private methods inside their class in Perl 6
如果我有一个 public 方法,我可以使用 $.name
和 self.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
已经被认为是直接访问该属性的意思,如果该属性不存在,则会为您提供编译时错误。
希望这能回答您的问题!
如果我有一个 public 方法,我可以使用 $.name
和 self.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
已经被认为是直接访问该属性的意思,如果该属性不存在,则会为您提供编译时错误。
希望这能回答您的问题!