Как Роли и Черты отличаются по Американскому лосю?

Если это - веб-приложение тогда могли бы быть преимущества для хранения изображений на сторонней сбытовой сети устройства хранения данных, таких как S3 Amazon или платформа Nirvanix.

21
задан Danny 8 July 2009 в 13:59
поделиться

2 ответа

Это единственное различие в том, как Лось использует термины «Черта» и «Роль». В документации и API Moose часто используется термин «черты» как «Применяемые роли. в метаклассы ". В вашем пересмотренном ответе ваш первый пример применяет роль к MyApp :: User метакласс через -traits , второй пример применяет его к class.

Если вы измените свой первый пример на:

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__->meta->foo();

, вы увидите " foo в [script]. line 3. " Это именно то, что он должен был делаю.

ОБНОВЛЕНИЕ: Видимо, я здесь не совсем прав. Черты - это роли, применяемые к экземплярам. Хук -traits применяет HasTable к экземпляру метакласса для MyApp :: User. Я обновил соответствующие документы Moose.

12
ответ дан 29 November 2019 в 22:08
поделиться

You don't define a package 'x::Foo' with any role. Ripped straight from the documentation, we see that register_implementation returns the name of an actually defined package:

package MyApp::Meta::Class::Trait::HasTable;
use Moose::Role;

has table => (
  is  => 'rw',
  isa => 'Str',
);

package Moose::Meta::Class::Custom::Trait::HasTable;
sub register_implementation { 'MyApp::Meta::Class::Trait::HasTable' }

package MyApp::User;
use Moose -traits => 'HasTable';

__PACKAGE__->meta->table('User');

The "shortcut" is achieved by Moose looking for "Moose::Meta::Class::Trait::$trait_name" (when called in a "class context"), not just passing back a shorter name.

0
ответ дан 29 November 2019 в 22:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: