2017-05-19 2 views
0

たPerl:以下のコード例でムース

と再帰的オブジェクトのインスタンス化、私は同じクラスの子オブジェクトを持つことができ、クラスPersonを定義しています。

私はprintTreeメソッドを呼び出すと、私は私が代わりに見る何を次のように出力

Sam Ram Geeta 

を期待していますが

SamRamRamRamRamRamRamRamRamRamRamR..... 

私が間違っているとどのように私の目標を達成するためにしています何上の任意のヒントです?問題は、例えば、@Person::kidsは、いずれかのインスタンスに属していない、とあなたが効果的にあなたがそれ属性にする必要があり

@Person::kids = ($r, $g); 
$s->printTree() loops through @Person::kids, calls 
$r->printTree() loops through @Person::kids, calls 
    $r->printTree() loops through @Person::kids, calls 
    $r->printTree() loops through @Person::kids, calls 
    ... 

で終わるということです

package Person; 

use Moose; 

has name => (is => 'ro'); 

my @kids; 

sub addChild { 
    my ($self, $name) = @_; 
    my $k = Person->new(name => $name); 
    push @kids, $k; 
    return $k; 
} 

sub printTree { 
    my $self = shift; 
    print $self->name; 
    $_->printTree foreach (@kids); 
} 



no Moose; 

package main; 

my $s = Person->new(name => "Sam"); 
my $r = $s->addChild("Ram"); 
my $g = $s->addChild("Geeta"); 

$s->printTree; 
+1

'printTree'の中で' printTree'を呼び出さないでください。 Btw、 '@子供たちはまた財産になるべきではない? –

+3

あなたの '@子供たち 'は、クラス内のシングルトンです。つまり、すべてのオブジェクトがそれを共有します。それは悪い考えです。それはプロパティでなければなりません。私は後で答えを書くだろう。 – simbabque

答えて

6

has kids => (
    isa => 'ArrayRef[Person]', 
    traits => ['Array'], 
    handles => { 
     all_kids => 'elements', 
     push_kids => 'push', 
    }, 
    default => sub { [] }, 
); 
sub addChild { 
    my ($self, $name) = @_; 
    my $k = Person->new(name => $name); 
    $self->push_kids($k); 
    return $k; 
} 
sub printTree { 
    my ($self) = @_; 
    print $self->name; 
    $_->printTree foreach $self->all_kids; 
} 

あなたはArray特性から他の有用なハンドルのためperldoc Moose::Meta::Attribute::Native::Trait::Arrayを確認することができます。

関連する問題