穆斯的属性与简单的子?

Nem*_*emo 5 perl

如何决定 - 下一个代码片段的推荐方法是什么?

我有一个基于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;
}
Run Code Online (Sandbox Code Playgroud)

VS

sub  data {
        my $href;
        $href = { a=>'a', b=>'b'}; #some code what builds a href
        return $href;
}
Run Code Online (Sandbox Code Playgroud)

有什么不同?我问,因为在打电话时:

my $obj = Some->new;
my $href = $obj->data;
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,我得到一个正确的HashRef.那么什么时候建议使用Moose-ish has结构(更长)和简单的datasub?

PS:对于普通的perl程序员来说,这个问题可能很简单,但是请记住,我仍然只是在学习perl.

tob*_*ink 6

如果您有一个属性,那么构造该对象的任何人都可以在构造函数中设置hashref:

my $obj = Some->new(data => { a => 'c', b => 'd' });
Run Code Online (Sandbox Code Playgroud)

(虽然在你的例子中,你已经使用了init_arg => undef哪种会禁用那种能力.)

此外,对于属性,构建器仅对每个对象运行一次,而使用标准方法时,可能会多次调用该方法.如果构建hashref是"昂贵的",那么这可能是一个重要的问题.

您会注意到的另一个区别是:

use Data::Dumper;
my $obj  = Some->new;
$obj->data->{c} = 123;
print Dumper( $obj->data );
Run Code Online (Sandbox Code Playgroud)