Лоси и Иса ArrayRef - PullRequest
       6

Лоси и Иса ArrayRef

3 голосов
/ 27 мая 2011

Я пытаюсь использовать Moose с Moose :: Meta :: Attribute :: Native :: Trait :: Array, но похоже, что помощник ArrayRef не работает для меня. Ниже - мой код, который возвращает

Can't call method "add_item" on unblessed reference at bug.pl line 42.

Я использую Moose 2.0007 и Perl v5.10.1. Moose :: Autobox установлен. Буду признателен за любое предложение.

#!/usr/bin/perl

use strict;

package CycleSplit;
use Moose;
has 'name'=>(isa=>'Str', is=>'rw');
has 'start'=>(isa=>'Num', is=>'rw');
has 'length'=>(isa=>'Num', is=>'rw');
1;

package Cycle;
use Moose;
my @empty=();
has 'name' => (isa => 'Str', is => 'rw');
has 'splits' => (
    traits  => ['Array'],
    isa=>'ArrayRef[CycleSplit]',
    is => 'rw',
    default=>sub { [] },
    handles=>{
        add_item=>'push',
    },
);


no Moose;
1;

package Main;

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->splits->add_item($spl);
    }

    my $text='';
    foreach my $spl ($cyc->splits) {
        $text.=$spl->name." ";
    }

    print $text;
}

Main;

1 Ответ

11 голосов
/ 27 мая 2011

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;
}
...