perl - 在Moose中,如何在设置属性后随时对其进行修改?

标签 perl moose

如果您有一个需要在设置时随时修改的属性,是否有一种巧妙的方式来完成此任务,而无需自己编写访问器并像本例中那样直接处理$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/

相关文章:

perl - 如何使用 perl AUTOLOAD 和 Moose::Meta::Class 动态添加不存在的属性?

perl - 我可以使用基于 Moose 的对象将正则表达式传递给 isa() 吗?

perl - Moose:如何获取对象数组?特质?

perl - 如何从 List::MoreUtils 执行 zip/mesh 的反向操作?

perl - 如何在 Perl 中使用任意长度的整数?

perl - 如何将方法修饰符应用于 AUTOLOAD 生成的方法?

perl - 如何(继续)学习 Moose 以很好地使用它 "fairly"?

perl - 带有模板工具包的行号

Perl Mechanize 单击单选按钮

linux - Perl 将一段哈希值保存到一个新的哈希值中