如何决定 - 下一个代码片段的推荐方法是什么?
我有一个基于Moose的模块,其中一些数据是简单的HashRef
。
可以写作为Mooseish HashRef
,如:
package Some;
has 'data' => (
isa => 'HashRef',
builder => '_build_href',
init_arg => undef,
lazy => 1,
);
sub _build-href {
my $href;
$href = { a=>'a', b=>'b'}; #some code what builds a href
return $href;
}
VS
sub data {
my $href;
$href = { a=>'a', b=>'b'}; #some code what builds a href
return $href;
}
有什么区别?我问,因为在打电话时:
my $obj = Some->new;
my $href = $obj->data;
在这两种情况下,我都得到了正确的HashRef。那么什么时候建议使用Moose-ish has
构造(更长)和简单data
sub?
答案 0 :(得分:6)
如果你有一个属性,那么构建对象的人可以在构造函数中设置hashref:
my $obj = Some->new(data => { a => 'c', b => 'd' });
(虽然在您的示例中,您使用了init_arg => undef
来禁用该功能。)
此外,对于属性,构建器仅对每个对象运行 ,而使用标准方法时,可能会多次调用该方法。如果构建hashref是“昂贵的”,那么这可能是一个重要的问题。
你会注意到的另一个不同之处在于:
use Data::Dumper;
my $obj = Some->new;
$obj->data->{c} = 123;
print Dumper( $obj->data );