Каков наилучший способ перегрузки строк на метод доступа атрибута Moose? - PullRequest
10 голосов
/ 29 августа 2011

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

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

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

Ответы [ 2 ]

7 голосов
/ 29 августа 2011
use overload '""' => sub {shift->id}, fallback => 1;

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

5 голосов
/ 29 августа 2011

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

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

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

Из документации overload

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

...