2011-06-22 88 views
-1

我使用草莓的Perl 駝鹿2.0010Perl的駝鹿默認值未設置

在類:

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年有一隻名爲吃的小貓 按任意鍵繼續。 。 。

未設置默認值。

謝謝。

回答

4

Your other question today顯示了在向Cat.pm顯示完整源代碼後出現的問題。您定義了一個流浪的new方法,該方法覆蓋Moose提供的new方法。刪除那個流浪的new方法,它工作得很好。

+0

@Weiyan - 如果你想用Moose覆蓋'new()',看看'BUILDARGS'和'BUILD':http://search.cpan.org/dist/Moose/lib/Moose/Manual/ Construction.pod – plusplus

3

$year就好了,因爲是(localtime)[5]

問題是您的對象由於某種原因未被初始化。也就是說,$ self-> birth_year()會返回undefined。

如果你看看你的輸出結果,「有一隻小貓命名吃在2011年」,你錯過了名字,它吃了什麼,年齡是2011 - 0(或者如果我記得我的減法表, )。由於undef被視爲0,因此在擔心年齡計算之前需要注意一些問題。

另外,我運行了你的代碼,而你要麼沒有告訴我們什麼,或者這是你的實際代碼的解釋。當我跑了它,我得到了預期的結果:「我有一隻名叫美麗吃魚在1997年14歲的小貓」

我相信這是因爲你沒有包括尾隨1;Cat.pm,就這樣,它甚至不會編譯。