Каков наилучший способ перегрузки строк на метод доступа атрибута 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
Я попробовал несколько вариантов, чтобы обойти это:
маркировка
id
is => bare
и заменив его собственным аксессором:sub id {$_[0]->{id}}
, Но это всего лишь взлом.Использование перегрузчика строк использует другой метод, который просто делегирует обратно id:
sub to_string {$_[0]->id}
,
Мне просто интересно, есть ли у кого лучший способ сделать это?
2 ответа
use overload '""' => sub {shift->id}, fallback => 1;
У меня отлично работает.
Я считаю, что вы получаете ошибку, потому что \&id
создает местозаполнитель для подпрограммы, которая будет определена позже, потому что Perl должен будет знать адрес, который будет иметь подпрограмма, когда он будет определен, чтобы создать ссылку на него. У Moose есть свои собственные проверки, чтобы попытаться избежать переписывания методов, которые вы определяете, и сообщает об этом вам.
Так как я думаю, что вы действительно хотите сделать, это позвонить id
метод, когда объект используется как укус, например:
use overload '""' => 'id', fallback => 1;
От overload
документация
Значения, указанные как строки, интерпретируются как имена методов.