Napisałem zestaw klas i interfejsów, które są implementowane w Moose również za pomocą ról. To, co mam problem ze zrozumieniem, to dokładne różnice w korzystaniu i wdrażaniu cech Łosia w porównaniu z rolami.Jak Role i Cechy różnią się w Moose?
W Moose documentation stany:
ważne jest, aby zrozumieć, że role i cechy to samo. Rola może być używana jako cecha, a cecha jest rolą. Jedyną rzeczą, która odróżnia tę dwójkę, jest to, że cecha jest pakowana w sposób, który pozwala Moose rozwiązać krótkie imię i nazwisko z nazwą klasy. Innymi słowy, ze względu na cechę, wywołujący może odwoływać się do niej za pomocą krótkiej nazwy, takiej jak "Big", a Moose rozwiąże ją w klasie takiej jak MooseX :: Embiggen :: Meta :: Attribute :: Role :: Big.
Rozumiem, że cechy i role są "takie same". Jednak podczas wdrażania podstawowego testu idei przy użyciu składni use Moose -traits 'Foo'
nie wydaje się, aby zrobić to, co bym oczekiwał. Na pewno tu czegoś brakuje.
To nie pierwszy przykład z "Nie można odnaleźć metody obiektowe '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'
W porównaniu do tego, (które działa):
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
Dzięki, to wyjaśnia zachowanie, które widziałem. – Danny
Zaktualizowałem tekst w Przedłużanie/Przepis1.pod, aby spróbować nieco odzwierciedlić tę różnicę. Zwróć też uwagę, by pomylić rzeczy bardziej podobne do ról, nazywane są cechami w innych językach, takich jak Scala. Cechy te są zdefiniowane w niektórych artykułach, które poinformowały o pochodzeniu implementacji roli Moose, ale nie posiadają funkcji przenoszenia stanu (tj. Są to tylko metody i nie mają żadnych atrybutów). – perigrin