私は、ロールを使用してMooseに実装されている一連のクラスとインターフェイスを作成しました。私が理解するのが苦労しているのは、ムースの特徴と役割の使い方と実装の正確な違いです。ムースの役割と形質の違いは?
役割と形質が同じものであることを理解することが重要です。役割は形質として使用でき、形質は役割です。この2つを区別する唯一の点は、特性が短い名前をクラス名に解決できるようにパッケージ化されていることです。言い換えれば、特性によって、呼び出し側は "Big"のような短い名前で参照でき、MooseはMooseX :: Embagen :: Meta :: Attribute :: Role :: Bigのようなクラスに解決します。
私の理解では、形質と役割は「同じ」です。しかし、use Moose -traits 'Foo'
構文を使用してアイデアの基本テストを実装すると、私が期待しているようには見えません。確かに私はここで何かを逃しているに違いない。
この最初の例では、(仕事をする)この1と比較すると
package MyApp::Meta::Class::Trait::HasTable;
use Moose::Role;
sub foo { warn 'foo' }
package Moose::Meta::Class::Custom::Trait::HasTable;
sub register_implementation { 'MyApp::Meta::Class::Trait::HasTable' }
package MyApp::User;
use Moose -traits => 'HasTable';
__PACKAGE__->foo(); #Can't locate object method 'foo'
「オブジェクトのメソッド 『foo』を見つけることができません」で失敗します。
package MyApp::Meta::Class::Trait::HasTable;
use Moose::Role;
sub foo { warn 'foo' }
package Moose::Meta::Class::Custom::Trait::HasTable;
sub register_implementation { 'MyApp::Meta::Class::Trait::HasTable' }
package MyApp::User;
use Moose;
with 'MyApp::Meta::Class::Trait::HasTable';
__PACKAGE__->foo(); #foo
ありがとう、それは私が見ていた動作を説明しています。 – Danny
私はこの違いを少し反映させるために、Extending/Recipe1.podのテキストを更新しました。他の言語では、Scalaのような役割のようなものはTraitsと呼ばれます。これらの特性はMooseの役割の実装の起源を知らせているが、状態を持つ機能が欠けている(つまり、メソッドのみで属性がない)いくつかの論文で定義されています。 – perigrin