Массив лося и иса

#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 мне не приходило в голову отказаться от них.