Как я могу предотвратить установку атрибутов Perl Moose только для чтения при вызове new?

Я хотел бы просто объявить в Moose атрибут только для чтения, который нельзя инициализировать при вызове new. Итак, после объявления следующего:

package SOD::KuuAnalyze::ProdId;

use Moose;

has 'users' => (isa => 'ArrayRef[Str]', is => "ro");

1;

Я не хочу, чтобы работало следующее:

my $prodid = SOD::KuuAnalyze::ProdId->new(users => ["one", "two"]);

person ennuikiller    schedule 28.11.2009    source источник
comment
у пользователей нет значения по умолчанию, как его установить?   -  person Schwern    schedule 30.11.2009


Ответы (2)


Используйте конфигурацию атрибута init_arg (см. «Параметры конструктора» в Moose: :Вручную::Атрибуты):

package SOD::KuuAnalyze::ProdId;
use Moose;

has 'users' => (
    isa => 'ArrayRef[Str]', is => "ro",
    init_arg => undef,    # do not allow in constructor
);
1;
person Ether    schedule 28.11.2009
comment
Это хорошо работает, спасибо. Однако он терпит неудачу молча. Есть ли способ заставить его выдавать ошибку при попытке ProdId-›new(users =›['one','two'])? - person ennuikiller; 29.11.2009
comment
Если вы используете MooseX::StrictConstructor, создание модуля завершится ошибкой, если в конструктор будут переданы какие-либо недопустимые или запрещенные аргументы. Я использую его почти во всех своих классах Moose (в остальном я использую MooseX::SlurpyConstructor, который захватывает все аргументы, не используемые атрибутами). - person Ether; 29.11.2009

Как насчет

package SOD::KuuAnalyze::ProdId;

use Moose;

has 'users' => ( isa => 'ArrayRef[Str]', is => 'ro', init_arg => undef, default => sub { [ 'one', 'two' ] } );

Установка init_arg в undef кажется необходимой, чтобы запретить установку атрибута из конструктора.

person friedo    schedule 28.11.2009