Как вы получаете MotherDogRobot для рождения массива объектов щенка, используя карту и хэш хэшей? - PullRequest
1 голос
/ 11 октября 2011

Метаданные Puppy считываются из файла конфигурации с помощью (General :: Config) и создают этот хэш хэшей

$puppy_hashes = {
 puppy_blue => { name => 'charlie', age => 4 },
 puppy_red  => { name => 'sam', age => 9 },
 puppy_yellow  => { name => 'jerry', age => 2 },
 puppy_green  => { name => 'phil', age => 5 },
}

пакет MotherDogRobot потребляет хэш щенков для рождения массива объектов щенков (смеется)

package MotherDogRobot;  
use Moose;
use Puppy;
use Data::Dumper;
#moose includes warn and strict

sub init_puppy{
  my($self,%options) = @_;
  my $puppy = Puppy->new( %options );
  return ($puppy);
}

sub birth_puppies{
  my($self,$puppy_hashes) = @_;
  my @keys = keys %{$puppy_hashes};
  my @puppies = map { $self->init_puppy( $puppy_hashes->{$_} ) } @keys;
  return(@puppies);
}

sub show_me_new_puppies{
  my($self,$puppy_hashes) @_;
  print Dumper($self->birth_puppies($puppy_hashes));
}

Ошибка нечетного числа аргументов

передача% параметров в Puppy-> new (% options)

щенкам от рождения не повезло - значит я не могу поставить лазеры на их головы = /

UPDATE

Я думаю, что проблема в том, что я передаю Hash Ref в init_puppy () вместо массива или хеша, поэтому, когда я пытаюсь передать опции% новому конструктору, он не получает правильное значение (key => ) пара - отсюда и нечетное количество аргументов ошибки.

Но с этой точки зрения я слишком долго смотрю на этот код, и я не могу понять, как правильно разыменовать его.

Кстати, это мой официальный 22-й день использования Perl!

Ответы [ 2 ]

3 голосов
/ 11 октября 2011

вы используете пустые переменные, как будто они не пустые, то есть вы вообще ничего не делаете

print "hi $_ " for my @foo;

Это предполагает, что показанный вами неполный фрагмент - это то, что вывы действительно используете

update: аналогично в sub init_puppy вы никогда не инициализируете my($self,%options)=@_;

#!/usr/bin/perl --
use strict;
use warnings;
Main( @ARGV );
exit( 0 );
sub Main {
    my $puppy_hashes = {
        puppy_blue   => { name => 'charlie', age => 4 },
        puppy_red    => { name => 'sam',     age => 9 },
        puppy_yellow => { name => 'jerry',   age => 2 },
        puppy_green  => { name => 'phil',    age => 5 },
    };

    for my $puppy ( MotherDogRobot->birth_puppies($puppy_hashes) ) {
        print join ' ', $puppy, $puppy->name, $puppy->age, $puppy->dump, "\n";
    }
}

BEGIN {
    package Puppy;
    BEGIN { $INC{'Puppy.pm'} = __FILE__; }
    use Any::Moose;
    has 'name' => ( is => 'rw', isa => 'Str' );
    has 'age'  => ( is => 'rw', isa => 'Int' );

    package MotherDogRobot;
    BEGIN { $INC{'MotherDogRobot.pm'} = __FILE__; }
    use Moose;
    use Puppy;

    sub init_puppy {
        my ( $self, %options ) = @_;
        my $puppy = Puppy->new(%options);
        return ($puppy);
    }

    sub birth_puppies {
        my ( $self, $puppy_hashes ) = @_;
        my @puppies = map { $self->init_puppy( %{$_} ) } values %$puppy_hashes;
        return (@puppies);
    }
    no Moose;
}
1 голос
/ 11 октября 2011

Стандартный конструктор Moose примет оба

->new( %{ $puppy_hashes->{$_} } )

и

->new( $puppy_hashes->{$_} )

, если $puppy_hashes содержит то, что вы говорите, и $_ является существующим ключом.

Более того, Moose не выдаст ошибку Error odd number of argments, если вы не передадите аргументы. (Вы ничего не назначаете на %config.)

Я не могу сказать, какая часть из того, что вы сказали, неверна, но то, что вы сказали, не складывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...