Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 在Moose属性访问器上实现字符串重载的最佳方法是什么?_Perl_Moose - Fatal编程技术网

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}
    。但这只是一个黑客

  • 让字符串重载程序使用另一种方法,该方法只会委托回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个参数从