Значение по умолчанию для Perl Moose не установлено - PullRequest
0 голосов
/ 22 июня 2011

Я использую клубничный Perl Лось 2.0010

В классе:

package Cat;
use 5.010;
use strict;
use Moose;

has 'name',       is => 'ro', isa => 'Str', default => 'Beauty';
#has 'age',       is => 'ro';
has 'diet',       is => 'rw', default => 'fish';
has 'birth_year', is => 'ro', isa=> 'Int',
                  default => 1997;
sub age
{
    my $self = shift;
    my $year = (localtime)[5] + 1900;

    return $year - $self->birth_year();
}

В заявке:

use 5.010;
use strict;
use Cat;

my $kitty = Cat->new();
say 'I have a kitten named ', $kitty->name(), ' eats ', $kitty->diet(),
    'in age ', $kitty->age();

Выход:

Использование неинициализированного значения в вычитание (-) в Cat.pm, строка 16. I есть котенок по имени ест в возрасте 2011 года Нажмите любую клавишу для продолжения . , .

Значение по умолчанию не установлено.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 22 июня 2011

Ваш второй вопрос сегодня показывает, в чем проблема после того, как вы указали полный источник Cat.pm. У вас есть определенный метод new, который переопределяет метод new, который предоставляет Moose. Удалите этот блуждающий new метод, и он работает просто отлично.

3 голосов
/ 22 июня 2011

$year просто отлично, как и (localtime)[5].

Проблема в том, что ваш объект по какой-то причине не был инициализирован. А именно, $ self-> birth_year () возвращается неопределенным.

Если вы посмотрите на ваш вывод "у котенка по имени есть в возрасте 2011 года", вы пропустите имя, то, что он ест, и возраст будет 2011 - 0 (или только 2011, если я помню свои таблицы вычитания) , Поскольку undef рассматривается как 0, у вас есть проблемы, о которых нужно позаботиться, прежде чем беспокоиться о расчете возраста.

Кроме того, я запустил ваш код, и вы либо ничего нам не говорите, либо это перефразирует ваш настоящий код. Когда я запустил его, я получил ожидаемые результаты: «У меня есть котенок по имени Бьюти, который ест рыбу в 1997 году в возрасте 14 лет»

Одна из причин, по которой я считаю это, заключается в том, что вы не включили конечный 1; в Cat.pm, поэтому он даже не будет компилироваться.

...