Perl Moose默认值未设置

时间:2011-06-22 03:12:02

标签: perl moose

我正在使用草莓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行减去( - )   在2011年有一只名叫吃的小猫   按任意键继续 。 。

未设置默认值。

感谢。

2 个答案:

答案 0 :(得分:4)

Your other question today显示了向Cat.pm显示完整来源后的问题。您定义了一个迷路new方法,该方法覆盖了new提供的Moose方法。删除那个迷路的new方法,它就可以了。

答案 1 :(得分:3)

$year就好了(localtime)[5]

问题是您的对象由于某种原因尚未初始化。也就是说,$ self-> birth_year()未定义。

如果你看看你的输出,“有一只名叫2011年吃的小猫”,你就会错过这个名字,吃什么,年龄是2011年 - 0(如果我还记得我的减法表,那么就是2011年) 。由于undef被视为0,因此在担心年龄计算之前,您需要注意一些问题。

另外,我运行了你的代码,你要么不告诉我们什么,要么就是你实际代码的解释。当我跑步时,我得到了预期的结果:“我有一只名叫Beauty的小猫在1997年14岁时吃鱼”

我认为这是因为您没有在1;中包含尾随Cat.pm的原因之一,因此它甚至不会编译。