【问题标题】:How can I change an overloaded operator on a Moose class at runtime?如何在运行时更改 Moose 类的重载运算符?
【发布时间】:2014-07-06 19:42:22
【问题描述】:

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

换句话说,我希望能够做这样的事情:

$obj = Class->new("a'");
$obj->formatter("A::Formatter");
print "$obj";

# prints "a'"

$obj->formatter("Another::Formatter");
print "$obj";

# prints a1

我还希望格式化程序是模块化的,这样我就可以封装和插入不同的格式化程序,而不会造成巨大的意大利面条混乱。

我应该如何最好地做到这一点?角色是解决这类问题的好方法吗?我已经检查了MooseX::Object::PluggableMooseX::Traits::PluggableMooseX::Traits 以开始但需要建议,因为这对我来说是未知的领域。

【问题讨论】:

    标签: perl moose


    【解决方案1】:

    您无需在运行时更改重载,只需更改其实现方式即可。请记住,重载可以使用方法 name 来完成,而不是 subref:

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

    【讨论】:

      猜你喜欢
      • 2019-05-21
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      • 2019-09-12
      • 1970-01-01
      • 2015-05-21
      相关资源
      最近更新 更多