3

私のMooベースのクラスには、両方defaultcoerceサブを持つレイジー属性と非レイジー属性の両方があります。属性を初期化しないと、defaultとsubsの両方が通常の属性に対して呼び出されますが、怠惰な属性に対してcoerceのみ呼び出されます。defaultそれは矛盾しているようです。サンプルコードは次のとおりです。

package Foo;
use Moo;

has nrml => ( is => 'ro',
              default => sub { print "nrml default\n" },
              coerce  => sub { print "nrml coerce\n" } 
            );

has lazy => ( is => 'ro',
              lazy => 1,
              default => sub { print "lazy default\n" },
              coerce  => sub { print "lazy coerce\n" }
            );



my $q = Foo->new( );

$q->lazy;

出力は次のとおりです。

nrml default
nrml coerce
lazy default

coerceコンストラクターで値を指定した場合にのみ実行されることを期待しています。さらに重要なことに、レイジー属性と通常の属性の両方から同じ実行シーケンス(またはと)が期待さdefaultれます。defaultcoerce

それで、私の期待は外れていますか、これはバグですか、それとも何ですか?ありがとう!

4

2 に答える 2

6

現在のステータス: 修正は 009014 に出荷されました

それらの2つのうちの1つはバグです。

実際、それについて考えてみると、強制がデフォルトで起動されるべきかどうかについてどちらの方法でも議論することができますが、Moose がそうしているので、強制は構造的であるため (アサーションのようなものによく使用される型チェックとは異なり、バグがある場合を除いて常にパスします)、そのようになると思います。

...実際、問題は Method::Generate::Accessor が起動するときに _use_default が常に _generate_simple_set にラップすることです。これは、isa+coerce+trigger ラッピングを提供するのが _generate_set である場合です - そして私は Moose がすべてを起動することをかなり確信していますデフォルトを適用する場合は 3 つなので、これも必要です。

ただし、設定する値を生成する方法を示す値を取得するために _generate_set をパラメーター化していないため、完全に簡単な修正ではありません。明日はリリースをカットする予定なので、明日整理しようと思います。

開発者からの Moo のサポートが必要な場合は、bugs-Moo@rt.cpan.org に連絡するか、irc.perl.org の #web-simple に参加してください。IRC チャネルの誰かがこの質問を見て、それについて質問してくれたのはまったくの幸運です。 :)

于 2012-03-17T20:21:43.490 に答える
3

それは私にとってバグと見なされます。からの値defaultが正しいタイプであることが期待されているか、そうでないかのいずれかです。半分の時間だけ期待を持ち、強制することは意味がありません。

于 2012-03-17T10:34:26.253 に答える