perl - 如何为 Moose 类型特征实现新句柄?

标签 perl moose

假设我想添加 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这里可能是一个函数的标识符,它不需要调用它的属性的硬编码名称。

最佳答案

你真的要加sayString ,或者您会满足于添加 say_foofoo ?

后者很容易:

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

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

关于perl - 如何为 Moose 类型特征实现新句柄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7655745/

相关文章:

perl - 使用 Perl 将不规则数据转换为结构化表格

perl - 如何将 Email::Mime 与 sendmail 结合使用

perl - 如何在 Perl 中垂直对齐文本行?

regex - 使用 Perl 拆分功能,但保留某些分隔符

perl - Moose::Error::Croak 错误报告不是从调用者的角度

perl - 如何使用MooseX::Storage来存储一大堆HashRef?

perl - Moose - 确定是否已设置惰性属性

Perl Moose - 从配置文件等加载值

linux - 每当在 linux 中使用 inode 创建新文件时,如何获取文件名以及文件的绝对路径?

perl - 如何用 UML 正确地表示 mixin/role/trait?