11

Moopslexical_hasで属性がどのように機能するかを理解しようとしています。この機能はから来ており、私が理解しているように、この関数は、スカラー参照 (に保持されている) を使用して、「字句的に持つ」可能性のある属性への参照を生成できます。次に、CODE 参照を使用して、スコープを「強制」する方法でクラス属性にアクセスできます (それらは「裏返し」であるため??)。しかし、これは単なる私の推測と野生の推測であるため、より良い説明をいただければ幸いです。また、次の例でこのアプローチが機能しないように見える理由も知りたいです。Lexical::Accessorlexical_hasCODEclassaccessor =>

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理論かもしれません。

4

1 に答える 1

1

OP が提出したチケットによると、このバグは Lexical-Accessor 0.009 で修正されました。

于 2020-07-26T11:10:27.523 に答える