2011-08-29 36 views
10

Tôi có một lớp mà tôi muốn áp dụng quá tải chuỗi trên thuộc tính id của nó. Tuy nhiên, Moose không cho phép quá tải chuỗi trên các trình truy cập thuộc tính. Ví dụ:cách tốt nhất để chuỗi quá tải trên một thuộc tính Moose accessor là gì?

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"; 

trên sẽ đưa ra một lỗi:

You are overwriting a locally defined method (id) with an accessor at C:/perl/site/lib/Moose/Meta/Attribute.pm line 927 

Tôi đã thử một vài tùy chọn để làm được việc này:

  1. Đánh dấu idis => bare, và thay thế nó với người truy cập của riêng tôi: sub id {$_[0]->{id}}. Nhưng đây chỉ là một hack.

  2. Có trình xử lý chuỗi quá tải sử dụng một phương pháp khác chỉ ủy quyền trở lại id: sub to_string {$_[0]->id}.

Tôi chỉ tự hỏi liệu có ai có cách làm tốt hơn không?

Trả lời

7
use overload '""' => sub {shift->id}, fallback => 1; 

Làm việc tốt cho tôi.

+0

Mà thực chất là phương án 2 từ câu hỏi theo cú pháp ngắn hơn. Tôi không nói nó xấu nhưng nó vẫn sẽ là thú vị để biết tại sao cách tiếp cận đầu tiên từ câu hỏi thất bại. – musiKk

+0

Cú pháp ngắn hơn là hơi sạch hơn. Với vấn đề 3 arg, tôi đoán đây phải là con đường để đi. – stevenl

5

Tôi tin rằng bạn đang gặp lỗi vì \&id tạo trình giữ chỗ cho một phụ được xác định sau, vì Perl sẽ cần phải biết địa chỉ phụ sẽ được xác định khi nó được xác định để tạo tham chiếu đến nó. Moose có kiểm tra riêng của nó để cố gắng tránh ghi đè phương pháp bạn xác định và báo cáo điều này cho bạn.

Vì tôi nghĩ rằng những gì bạn thực sự muốn làm là gọi phương thức id khi đối tượng được sử dụng như một sting như vậy:

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

Từ overload documentation

Values specified as strings are interpreted as method names.

+0

Nó không hoạt động. Tôi vẫn nhận được thông báo lỗi: 'Không thể gán giá trị cho một người truy cập chỉ đọc tại đầu đọc Foo :: id (được xác định tại dòng 4) dòng 3 Foo :: id ('Foo = HASH (0x12ffa10)', undef , '') được gọi là at - line 12' –

+0

@Hynek, có vẻ như 'overload' đang truyền tham số cho phương thức, mà Moose diễn giải như một nỗ lực để thiết lập thuộc tính. Vì vậy, bạn sẽ cần phải sử dụng một phụ trung gian, như bạn đã làm trong câu trả lời của bạn. – cjm

+4

Tôi thấy rằng lỗi này là do 'overload' luôn truyền 3 args cho phương thức từ [Overload - calling convention] (https://metacpan.org/module/overload#Calling-Conventions-and-Magic-Autogeneration) – stevenl

Các vấn đề liên quan