Каков наилучший способ перегрузки строк на метод доступа атрибута 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. маркировка idis => bareи заменив его собственным аксессором: sub id {$_[0]->{id}}, Но это всего лишь взлом.

  2. Использование перегрузчика строк использует другой метод, который просто делегирует обратно id: sub to_string {$_[0]->id},

Мне просто интересно, есть ли у кого лучший способ сделать это?

2 ответа

Решение
use overload '""' => sub {shift->id}, fallback => 1;

У меня отлично работает.

Я считаю, что вы получаете ошибку, потому что \&id создает местозаполнитель для подпрограммы, которая будет определена позже, потому что Perl должен будет знать адрес, который будет иметь подпрограмма, когда он будет определен, чтобы создать ссылку на него. У Moose есть свои собственные проверки, чтобы попытаться избежать переписывания методов, которые вы определяете, и сообщает об этом вам.

Так как я думаю, что вы действительно хотите сделать, это позвонить id метод, когда объект используется как укус, например:

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

От overload документация

Значения, указанные как строки, интерпретируются как имена методов.

Другие вопросы по тегам