我有一个类,我想在其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
我尝试了几种方法来解决这个问题:
标记id
is => bare
,并将其替换为我自己的访问者:sub id {$_[0]->{id}}
。但这只是一个黑客攻击。
让字符串重载符使用另一个方法,该方法只委托给id:sub to_string {$_[0]->id}
。
我只是想知道是否有人有更好的方法这样做?
答案 0 :(得分:7)
use overload '""' => sub {shift->id}, fallback => 1;
对我来说很好。
答案 1 :(得分:5)
我相信你收到错误是因为\&id
为稍后定义的sub创建了一个占位符,因为Perl需要知道sub定义为创建对它的引用时所具有的地址。 Moose有自己的检查,试图避免覆盖您定义的方法并向您报告。
因为我认为你真正想做的是当对象被用作刺痛时调用id
方法:
use overload '""' => 'id', fallback => 1;
指定为字符串的值将被解释为方法名称。