Perl 如何在运行时更改Moose类上的重载运算符?
我有一个带有重载字符串化操作符的Moose类,实际上我想在运行时更改它,因为我需要不同格式的文本输出 换言之,我希望能够做到以下几点:Perl 如何在运行时更改Moose类上的重载运算符?,perl,moose,Perl,Moose,我有一个带有重载字符串化操作符的Moose类,实际上我想在运行时更改它,因为我需要不同格式的文本输出 换言之,我希望能够做到以下几点: $obj = Class->new("a'"); $obj->formatter("A::Formatter"); print "$obj"; # prints "a'" $obj->formatter("Another::Formatter"); print "$obj"; # prints a1 我还希望格式化程序是模块化的,这样我
$obj = Class->new("a'");
$obj->formatter("A::Formatter");
print "$obj";
# prints "a'"
$obj->formatter("Another::Formatter");
print "$obj";
# prints a1
我还希望格式化程序是模块化的,这样我就可以封装和插入不同的格式化程序,而不会造成巨大的意大利面混乱
我应该如何最好地做到这一点?角色是解决这类问题的好办法吗?我已经检查过了,要开始,但需要建议,因为这是我未知的领域 您不需要在运行时更改重载,只需要更改它的实现方式即可。请记住,重载可以使用方法名而不是子引用来完成:
package Foo;
use Moose;
use overload q{""} => '_stringify';
has id => (
is => 'ro',
isa => 'Str',
required => 1,
);
has formatter_class => (
is => 'rw',
isa => 'ClassName',
required => 1,
);
sub _stringify {
my $self = shift;
return $self->formatter_class()->new()->format($self);
}