【问题标题】:How can I implement a new handle for a Moose type trait?如何为 Moose 类型特征实现新句柄?
【发布时间】:2011-10-05 01:10:12
【问题描述】:

假设我想将say 功能添加到String (注意:这是一个比现实更简单的示例)。所以我可以有

has foo => (
   isa => 'Str',
   traits => [ 'String' ],
   handles => {
     say_foo => 'say',
   }
);

我当然可以用它来做。

$self->foo( 'bar' );

$self->say_foo;

按字面意思打印

'bar\n'

我想子程序会是这样的

sub _say_attr {
   my ( $self, $attr ) = @_;
   say $attr;
}

任何人都可以帮助我填补关于如何实际实现这一点的空白吗?关于如何编写自己的 handles 的文档,我并没有真正看到太多。

我真的不需要知道如何修改 String 特征。尽管我希望能够拥有一个通用处理程序,但我不需要知道当前属性的名称即可使其工作。

has foo => (
    isa => 'Str',
    traits => [ 'PrintString' ],
     handles => {
         say_foo => 'say',
     }
);
has bar => (
    isa => 'Str',
    traits => [ 'PrintString' ],
     handles => {
         say_bar => 'say',
     }
);

所以say 这里可能是一个函数的标识符,它不需要调用它的属性的硬编码名称。

【问题讨论】:

    标签: perl moose


    【解决方案1】:

    您真的想将say 添加到String,还是满足于将say_foo 添加到foo

    后者很简单:

    has foo => (
       isa => 'Str',
       traits => [ 'String' ],
       handles => {
         say_foo => sub { say $_[0]->foo; },
       }
    );
    

    如果您想要一个更通用的解决方案,您应该查看Moose::Meta::Attribute::Native::Trait::String 并复制/包装/子类而不是尝试更改它。

    【讨论】:

    • 我不需要说太多...修改字符串...但是我不想知道属性的名称,因此我可以将此行为一般应用于多个属性.
    • @xenotarracide,然后我建议你看看现有的特征并效仿它的作用。如果您还有问题,请提出更具体的问题。
    猜你喜欢
    • 2019-12-08
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多