Ich habe eine Reihe von Klassen und Schnittstellen geschrieben, die in Moose auch mit Rollen implementiert sind. Was ich nicht verstehen kann, sind die genauen Unterschiede bei der Verwendung und Implementierung von Moose-Merkmalen im Vergleich zu Rollen.Wie unterscheiden sich Rollen und Eigenschaften in Elch?
Die Moose documentation Staaten:
Es ist wichtig zu verstehen, dass die Rollen und Eigenschaften die gleiche Sache sind. Eine Rolle kann als Merkmal verwendet werden, und eine Eigenschaft ist eine Rolle. Das einzige, was die beiden unterscheidet, ist, dass ein Merkmal so verpackt ist, dass Moose einen kurzen Namen in einen Klassennamen auflöst. Mit anderen Worten, mit einem Merkmal kann der Aufrufer darauf durch einen kurzen Namen wie "Big" verweisen, und Moose wird es in eine Klasse wie MooseX :: Embiggen :: Meta :: Attribute :: Role :: Big auflösen.
Es ist mein Verständnis, dass Merkmale und Rollen "die gleichen" sind. Allerdings, wenn die Implementierung eines grundlegenden Tests der Idee mit der use Moose -traits 'Foo'
Syntax scheint nicht zu tun, was ich erwarten würde. Sicherlich muss ich hier etwas vermissen.
Dieses erste Beispiel schlägt mit
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'
Im Vergleich zu diesem (die Arbeit der Fall ist) "Can not Objektmethode 'foo' finden":
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
Danke, das erklärt das Verhalten, das ich sah. – Danny
Ich habe den Text in Extending/Recipe1.pod aktualisiert, um zu versuchen, diesen Unterschied ein wenig widerzuspiegeln. Beachten Sie auch, Dinge mehr zu verwirren. Rollenähnliche Dinge werden in anderen Sprachen wie Scala als Traits bezeichnet. Diese Merkmale sind in einigen Papieren definiert, die den Ursprung von Mooses Rollenimplementierung beschrieben haben, aber nicht den Status, der Merkmale enthält (dh sie sind nur Methoden und haben keine Attribute). – perigrin