builder
を使用すると、サブクラスが属性のデフォルトを簡単に上書きできるようになり、役割はrequire
になります。また、これはそうのようなdefault
を使用して達成することができます。Moose "builder" vs "default"
has 'foo' =>
is => 'rw',
isa => 'Str',
default => sub { $_[0]->_build_foo };
私は認識していないよbuilder
を使用する更なる利点がある場合、私は思ったんだけど?私はいくつかの自分を作ってみた:あなたはfoo
が_build_foo
builder
によって構築されていることをイントロスペクションできるよう
builder
は、宣言され、それが少し速くbuilder
行うサブルーチンラッパーが使用することができます排除役に立つlazy_build
明確にするためにUPDATE、これは約default
一般的にbuilder
しかしbuilder => '_build_foo'
対default => sub { $_[0]->_build_foo }
対ではありません。
なぜ 'default => \&builder'はそれらすべてのことをしないのですか? – ikegami
@ikegami '\&builder'は現在のパッケージの'&builder'に解決されるためです。新しい 'builder 'を提供するサブクラスは、' has' + attr '=> builder => \&builder'をもう一度やり直す必要があります。 OTOH 'builder => 'builder'は実行時に解決されます。 – hobbs
対称として、サブクラスは属性を上書きして 'default'を変更することができます。これはおそらくプライベートな 'builder'メソッド名を知る必要はありません。 *両方とも*属性が 'default'または' builder'を使用しているかどうかを知る必要があります。これは一般に個人情報であり、変更される可能性があります。 Mooseの属性のデフォルトの動作をオーバーライドするのは問題があるため、そのデフォルト動作がどのように実装されているか、サブクラスがイントロスペクションを行う方法の詳細を公開する必要があります。 :/ – Schwern