#perl #moose
Вопрос:
Я пытаюсь использовать Moose с Moose::Meta::Атрибут::Родной::Признак::Массив, но, похоже, помощник ArrayRef для меня не работает. Ниже приведен мой код, который возвращает
Can't call method "add_item" on unblessed reference at bug.pl line 42.
Я использую Moose 2.0007 и Perl v5.10.1. Установлен Moose::Автобокс. Я был бы признателен за любое предложение.
#!/usr/bin/perl используйте строгие; пакет разделен на циклы; используйте Лося; имеет 'имя'=>(isa=>>'Str', is=>>>'rw'); имеет 'start'=>(isa=>>'Num', is=>>>'rw'); имеет 'длину'=>(isa=>>'Число', is=>>>'rw'); 1; цикл упаковки; используйте Лося; мой @пустой=(); имеет 'имя' => (isa =>> 'Str', is =>>> 'rw'); и "разбивает" = > ( черты характера => ['время'], в ISA=>'ArrayRef[CycleSplit]', это => 'РВ', по умолчанию=>суб { [] }, ручки=>{ add_item=>'нажать', }, ); никакого Лося; 1; пакет Основной; подраздел Основной { мой $cyc=Цикл->новый(); $cyc->имя("Дни недели"); для моего $i (1..7) { мой $spl=циклсплит->новый(); $spl->имя("День $i"); $spl->начало($i/7-(1/7)); $spl->длина(1/7); $cyc->разбиения->>add_item($spl); } мой $текст="; для каждого моего $spl ($cyc->расщепления) { $текст.=$spl->имя." "; } распечатать $текст; } Главная;
Комментарии:
1. Не эксперт по лосям, но попробуйте: $cyc->add_item($spl);
Ответ №1:
handles
добавьте метод в сам класс, а не в атрибут. Другая проблема заключается в том, что splits
атрибут по-прежнему является arrayref, поэтому вам нужно разыменовать его в считанные секунды foreach
. Исправленный код выглядит следующим образом:
sub Main {
my $cyc=Cycle->new();
$cyc->name("Days of week");
for my $i (1..7) {
my $spl=CycleSplit->new();
$spl->name("Day $i");
$spl->start($i/7-(1/7));
$spl->length(1/7);
$cyc->add_item($spl); # removed splits
}
my $text='';
foreach my $spl (@{ $cyc->splits }) { # added array dereference
$text.=$spl->name." ";
}
print $text;
}
Комментарии:
1. Обратите внимание, что вы можете сказать
handles => { ..., items => 'elements' }
и получить списокitems
напрямую, без разыменования. Я предпочитаю этот вариант, так как он не позволяет людям протаскивать ценности мимо проверки.2. @phaylon: согласен; Я никогда не использую
is =>
опцию для собственных атрибутов признаков, поэтому доступ возможен только с помощью делегированных методов.3. @Эфир — спасибо за подсказку. Я всегда использую делегированные методы, но
is
мне не приходило в голову отказаться от них.