我有以下五个麋鹿属性:
has ['summary_file', 'html_file', 'url1', 'url2', 'txt_file'] => (
is => 'rw',
isa => 'Str',
required => 0,
lazy => 1,
default => sub { confess "Attribute not set"; },
);
我想:
'summary_file'
使用_build_summary_file
等。)confess
子状态,其中调用了(未初始化)属性(例如"Attribute 'summary_file' not set"
)。我可以通过编写五个单独的has
来完成上述操作,但也许有更简洁的方法?
答案 0 :(得分:4)
您可以执行以下操作(下面的“不工作”评论后的新工作示例):
package My::Class;
use Moose;
use namespace::autoclean;
for my $attr (qw(x y)) {
has $attr => (
is => 'rw',
isa => 'Str',
required => 0,
lazy => 1,
builder => "_build_$attr",
);
}
sub _build_x { rand }
sub _build_y { rand }
__PACKAGE__->meta->make_immutable;
package main;
use strict; use warnings;
my $o = My::Class->new;
print $o->$_, "\n" for qw(x y);
请注意,您无法同时指定default
和builder
。
has ['summary_file', 'html_file', 'url1', 'url2', 'txt_file'] => (
is => 'rw',
isa => 'Str',
required => 0,
lazy_build => 1,
);
答案 1 :(得分:0)
如果您正在寻找一个属性,以便在没有设置值时在访问时抛出异常,请查看MooseX::LazyRequire。
如果您正在寻找一个构建器,如果它被调用则抛出警告,请在构建器方法中包含该语句...或者使用访问器/阅读器方法来执行此操作。 (例如“before 'attribute_name' => sub { ...complain... };
”)
如果您正在寻找一种使用lazy_build使用相同命名约定为属性指定构建器方法的方法,请参阅MooseX::AttributeShortcuts(支持“builder => 1
”为“builder => "_build_${attribute_name}"
”)