1

mixinmixin::withモジュールの違いがわかりません。

package Dog;
sub speak { print "Bark!\n" }
sub new { my $class = shift;  bless {}, $class }

package Dog::Small;
use base 'Dog';
sub speak { print "Yip!\n"; }

package Dog::Retriever;
use mixin::with 'Dog';
sub fetch { print "Get your own stinking $_[1]\n" }

package Dog::Small::Retriever;
use base 'Dog::Small';
use mixin 'Dog::Retriever';

my $small_retriever = Dog::Small::Retriever->new;
$small_retriever->speak;          # Yip!
$small_retriever->fetch('ball');  # Get your own stinking ball

上記のコードでは、次のコードを使用できます。

package Dog::Small::Retriever;
use base 'Dog::Small';
use mixin 'Dog::Retriever';

次のものに置き換えられますか?

package Dog::Small::Retriever;
#use base 'Dog::Small';
use mixin:with 'Dog::Retriever';
4

1 に答える 1

2

mixin::with は、動作を追加/変更するクラス (この例では Dog::Small および Dog::Retriever) を定義する際に使用することを意図しているように見えますが、mixin は最終的な消費クラス (Dog::Small: :レトリーバー)。

ただし、mixin::with のドキュメントでは、「mixinの代わりに、trait の使用を検討してください。実装については、Class::Trait を参照してください」と示唆されていることにも注意してください。Class::Trait は非推奨であり、Moose::Role を提案します。

use base 'Dog::Small'ああ、宣言をスキップすることはできません。スキップした場合、クラスはDog::Small(またはDog) から継承されません。

于 2013-03-19T14:55:12.423 に答える