我对perl中的Moose很陌生,当我遇到这个文档时,我一直在阅读它的文档,而我并不完全理解这个文档:
如果要使用任何类型的引用作为默认值,则必须从子例程返回该引用。好的,我得到这条语句,下一个例子是
has 'mapping' => (
is => 'ro',
default => sub { {} },
);这是必要的,因为否则Perl将实例化引用一次,并且它将被所有对象共享:--我不理解的--这意味着它将实例化引用一次,并由所有对象共享。怎么做?
has 'mapping' => (
is => 'ro',
default => {}, # wrong!
);如果将一个空的非子例程引用作为默认值传递,驼鹿将抛出一个错误。
如果Moose允许这样做,那么默认的映射属性很容易在许多对象之间共享。相反,将它包装在一个子程序引用中,就像我们前面看到的那样。,不要再这样了,
发布于 2013-07-16 08:26:13
因为它会在一定距离内产生动作,这是不好的。说明这一问题:
package Wrong;
my $default = {};
sub new {
my ($class) = @_;
return bless $default => $class;
}
package main;
use 5.010;
my @wobj;
push @wobj, Wrong->new for 0..2;
$wobj[0]->{some_new_attr} = 'foobar';
use Data::Dumper qw(Dumper);
print Dumper $wobj[1]; # huh????!
print Dumper $wobj[2]; # that one, too?! why?
say for @wobj; # ah, it's the same shared address
package Correct;
my $default = sub { return {} };
sub new {
my ($class) = @_;
return bless $default->() => $class;
}
package main;
my @cobj;
push @cobj, Correct->new for 0..2;
$cobj[0]->{some_new_attr} = 'foobar';
print Dumper $cobj[$_] for 0..2; # instances 1 and 2 are unaffected
say for @cobj; # all different addresseshttps://stackoverflow.com/questions/17667193
复制相似问题