Ho scritto un set di classi e interfacce implementate in Moose utilizzando anche i ruoli. Quello che ho difficoltà a capire sono le differenze esatte nell'uso e nell'implementazione dei tratti Moose rispetto ai ruoli.In che modo i ruoli e i tratti differiscono in Moose?
I Moose documentation stati:
E 'importante capire che i ruoli e le caratteristiche sono la stessa cosa. Un ruolo può essere usato come tratto e un tratto è un ruolo. L'unica cosa che distingue i due è che un tratto è confezionato in un modo che consente a Moose di risolvere un nome breve con un nome di classe. In altre parole, con un tratto, il chiamante può riferirsi ad esso con un nome breve come "Big", e Moose lo risolverà in una classe come MooseX :: Embiggen :: Meta :: Attribute :: Role :: Big.
È a mia conoscenza che tratti e ruoli sono "uguali". Tuttavia, quando si implementa un test di base dell'idea utilizzando la sintassi use Moose -traits 'Foo'
non sembra fare ciò che mi aspetterei. Sicuramente mi mancherà qualcosa qui.
Questo primo esempio viene a mancare con "Impossibile trovare il metodo oggetto '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 -traits => 'HasTable';
__PACKAGE__->foo(); #Can't locate object method 'foo'
Rispetto a questo (che funziona):
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
Grazie, questo spiega il comportamento che stavo vedendo. – Danny
Ho aggiornato il testo in Extending/Recipe1.pod per cercare di riflettere un po 'questa differenza. Nota anche per confondere le cose più Le cose simili a ruoli sono chiamate Tratti in altri linguaggi come Scala. Questi tratti sono definiti in alcuni documenti che hanno informato l'origine dell'implementazione del ruolo di Moose ma mancano delle funzionalità di trasporto dello stato (ovvero sono solo metodi e non hanno attributi). – perigrin