Perl:使用 Moose 进行递归对象实例化
Perl: Recursive object instantiation with Moose
在下面的示例代码中,我定义了一个 class Person
可以具有相同 class.
的子对象
当我调用 printTree
方法时,我期望得到以下输出
Sam Ram Geeta
我看到的是
SamRamRamRamRamRamRamRamRamRamRamR.....
关于我做错了什么以及如何实现我的目标的任何提示?
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;
问题是 @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
...
您需要将其设为属性,例如
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;
}
您可以检查 perldoc Moose::Meta::Attribute::Native::Trait::Array 从 Array
特性中寻找其他有用的句柄。
在下面的示例代码中,我定义了一个 class Person
可以具有相同 class.
当我调用 printTree
方法时,我期望得到以下输出
Sam Ram Geeta
我看到的是
SamRamRamRamRamRamRamRamRamRamRamR.....
关于我做错了什么以及如何实现我的目标的任何提示?
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;
问题是 @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
...
您需要将其设为属性,例如
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;
}
您可以检查 perldoc Moose::Meta::Attribute::Native::Trait::Array 从 Array
特性中寻找其他有用的句柄。