Moopslexical_has
で属性がどのように機能するかを理解しようとしています。この機能はから来ており、私が理解しているように、この関数は、スカラー参照 (に保持されている) を使用して、「字句的に持つ」可能性のある属性への参照を生成できます。次に、CODE 参照を使用して、スコープを「強制」する方法でクラス属性にアクセスできます (それらは「裏返し」であるため??)。しかし、これは単なる私の推測と野生の推測であるため、より良い説明をいただければ幸いです。また、次の例でこのアプローチが機能しないように見える理由も知りたいです。Lexical::Accessor
lexical_has
CODE
class
accessor =>
Moops イントロダクションの一部である例から作業して、次のものを作成していclass Car
ます。
use Moops;
class Car {
lexical_has max_speed => (
is => 'rw',
isa => Int,
default => 90,
accessor => \(my $max_speed),
lazy => 1,
);
has fuel => (
is => 'rw',
isa => Int,
);
has speed => (
is => 'rw',
isa => Int,
trigger => method ($new, $old?) {
confess "Cannot travel at a speed of $new; too fast"
if $new > $self->$max_speed;
},
);
method get_top_speed() {
return $self->$max_speed;
}
}
次に、オブジェクトをインスタンス化し、そのメソッドを使用してその属性にアクセスしようとします。
my $solarcharged = Car->new ;
# This correctly won't compile due to $max_speed scoping:
# say $solarcharged->$max_speed;
# This shows expected error "too fast"
$solarcharged->speed(140);
# This prints nothing - wrong behavior?
say $solarcharged->get_top_speed();
カスタム アクセサーを使用する最後の行には困惑します。何も起こりません。クラスの属性または設定が不足していますか (熱心またはlazy => 0
機能しないとマークされています)。関数が必要BUILD
ですか?私が見逃している初期化ステップはありますか?
注: 次のようなセッター メソッドをクラスに追加すると、次のようになります。
method set_top_speed (Int $num) {
$self->$max_speed($num);
}
そして、最後の一連のステートメントでそれを呼び出します。
# shows expected error "too fast"
$solarcharged->speed(140);
$solarcharged->set_top_speed(100);
# prints 100
say $solarcharged->get_top_speed();
メソッドはget_top_speed()
適切に戻り始めます。これは期待されていますか?もしそうなら、クラス設定のデフォルトはどのように機能しますか?
これをバグとして報告しました: https://rt.cpan.org/Public/Bug/Display.html?id=101024。
「perl 規則」を使用することで (つまりlexical_has
、プライベート属性を使用せず、「 」を前に付けることで)これを簡単に回避でき_
、この質問はバグから生じたものであるため、修正やパッチが回答として期待されていません。Lexical::Accessor
報奨金について - がどのように機能するのかを説明していただければ幸いです。アクセサーにプライベート内部スコープを「強制」する方法。そして、それが良いことである理由についてのCS理論かもしれません。