如果您有一个需要在设置时随时修改的属性,是否有一种巧妙的方式来完成此任务,而无需自己编写访问器并像本例中那样直接处理$self
的内容?
package Foo;
use Moose;
has 'bar' => (
isa => 'Str',
reader => 'get_bar',
);
sub set_bar {
my ($self, $bar) = @_;
$self->{bar} = "modified: $bar";
}
我考虑了
trigger
,但是它似乎需要相同的方法。是否直接使用
$self
中的哈希引用被认为是Moose中的不良做法,还是我担心没有问题?
最佳答案
我不确定您需要哪种修改,但是您可以通过使用类型强制转换来实现所需的修改:
package Foo;
use Moose;
use Moose::Util::TypeConstraints;
subtype 'ModStr'
=> as 'Str'
=> where { /^modified: /};
coerce 'ModStr'
=> from 'Str'
=> via { "modified: $_" };
has 'bar' => (
isa => 'ModStr',
is => 'rw',
coerce => 1,
);
如果使用此方法,则并非所有值都会被修改。任何通过验证的ModStr都将直接使用:
my $f = Foo->new();
$f->bar('modified: bar'); # Set without modification
这种弱点可能是可以的,或者可能会使这种方法无法使用。在适当的情况下,这甚至可能是一个优势。
关于perl - 在Moose中,如何在设置属性后随时对其进行修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1415663/