Perl 在Moose属性访问器上实现字符串重载的最佳方法是什么?
我有一个类,我想在它的Perl 在Moose属性访问器上实现字符串重载的最佳方法是什么?,perl,moose,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; pri
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{$\u0]->{id}
。但这只是一个黑客sub到_string{$\[0]->id}
use overload '""' => sub {shift->id}, fallback => 1;
对我来说效果很好。我相信您会收到一个错误,因为
\&id
为稍后定义的sub创建了一个占位符,因为Perl需要知道sub在定义时的地址以创建对它的引用。Moose有自己的检查,以避免覆盖您定义的方法并向您报告
因为我认为,当对象用作sting时,您真正想要做的是调用id
方法,如下所示:
use overload '""' => 'id', fallback => 1;
从
指定为字符串的值被解释为方法名
这基本上是问题中的选项2,语法较短。我并不是说这很糟糕,但了解问题中的第一种方法失败的原因仍然很有意思。对于3arg问题,我想这应该是解决的办法。它不起作用。我仍然收到错误消息:
无法在reader Foo::id(在-4行定义)第3行Foo::id('Foo=HASH(0x12ffa10'),undef')处为只读访问器赋值,在-12行调用的@Hynek,看起来重载
正在向方法传递参数,Moose将其解释为试图设置属性。因此,您需要使用一个中间子函数,正如您在回答中所做的那样。我发现这个错误是因为重载总是将3个参数从