Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何在运行时更改Moose类上的重载运算符?_Perl_Moose - Fatal编程技术网

Perl 如何在运行时更改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 我还希望格式化程序是模块化的,这样我

我有一个带有重载字符串化操作符的Moose类,实际上我想在运行时更改它,因为我需要不同格式的文本输出

换言之,我希望能够做到以下几点:

$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);
}