在Moose属性访问器上进行字符串重载的最佳方法是什么?

时间:2011-08-29 12:49:20

标签: perl moose

我有一个类,我想在其id属性上应用字符串重载。但是,Moose不允许在属性访问器上进行字符串重载。例如:

package Foo;
use Moose;
use overload '""' => \&id, fallback => 1;
has 'id' => (
    is => 'ro',
    isa => 'Int',
    default => 5,
);

package main;
my $foo = Foo->new;
print "$foo\n";

上面会出错:

You are overwriting a locally defined method (id) with an accessor at C:/perl/site/lib/Moose/Meta/Attribute.pm line 927

我尝试了几种方法来解决这个问题:

  1. 标记id is => bare,并将其替换为我自己的访问者:sub id {$_[0]->{id}}。但这只是一个黑客攻击。

  2. 让字符串重载符使用另一个方法,该方法只委托给id:sub to_string {$_[0]->id}

  3. 我只是想知道是否有人有更好的方法这样做?

2 个答案:

答案 0 :(得分:7)

use overload '""' => sub {shift->id}, fallback => 1;

对我来说很好。

答案 1 :(得分:5)

我相信你收到错误是因为\&id为稍后定义的sub创建了一个占位符,因为Perl需要知道sub定义为创建对它的引用时所具有的地址。 Moose有自己的检查,试图避免覆盖您定义的方法并向您报告。

因为我认为你真正想做的是当对象被用作刺痛时调用id方法:

use overload '""' => 'id', fallback => 1;

来自overload documentation

  

指定为字符串的值将被解释为方法名称。