【发布时间】:2014-12-07 01:28:01
【问题描述】:
我需要为 Moose 类实例添加属性。在下面的代码中,当我创建 Child 类的实例并向其添加属性“app”时,我发现在创建下一个实例时也添加了此属性。我做错了什么,我再次需要每个创建实例的属性。
#!C:\perl\bin\perl.exe
#!/usr/bin/perl
use v5.10;
use Moose;
use Data::Dumper;
{
package Child;
use Moose;
use utf8;
sub name {
say "My name is Richard";
}
}
sub add_attribute {
my ($object, $attr) = @_;
my $meta = $object->meta;
if (!$object->can("app")) {
$meta->add_attribute(app => (is => 'rw', default => sub{$attr}));
$object->app($attr);
}
else {
#$object->app($attr);
say "attr $attr already exists: object=". ref($object) . ", attr=".($object->app);
}
}
my $child = Child->new;
$child->name;
add_attribute($child, "First");
say "Child Attr: " . $child->app;
say "";
say Dumper($child);
my $child1 = Child->new;
$child1->name;
#add_attribute($child1, "Second");
say "Child1 Attr: " . $child1->app;
say Dumper($child1);
#say Dumper($child1->meta);
输出:
My name is Richard
Child Attr: First
$VAR1 = bless( {
'app' => 'First'
}, 'Child' );
My name is Richard
Child1 Attr: First
$VAR1 = bless( {
'app' => 'First'
}, 'Child' );
【问题讨论】:
-
您打算如何在实例上创建方法?在基于类的对象系统的上下文中这意味着什么?
-
据我了解,Moose 属性存储在对象实例中的散列中,所以如果我在第一个实例中添加一个属性,为什么这个属性也存在于下一个创建的实例中?我的问题现在清楚了吗?