2011-08-29 2 views
10

id 속성에 문자열 오버로드를 적용하려는 클래스가 있습니다. 그러나 Moose는 속성 접근 자에 문자열 오버로드를 허용하지 않습니다. 예를 들어 :이 해결하기 위해 몇 가지 옵션을 시도Moose 속성 접근 자에 문자열 오버로드하는 가장 좋은 방법은 무엇입니까?

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을 표시하고 교체

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

    위의 오류를 줄 것이다 내 접근 자 : sub id {$_[0]->{id}}. 그러나 이것은 단지 해킹 일뿐입니다.

  2. 문자열 오버로더를 사용하면 id : sub to_string {$_[0]->id}으로 다시 위임하는 다른 방법을 사용할 수 있습니다.

나는이 일을하는 더 좋은 방법이 있는지 궁금한가요?

답변

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

저에게 잘 작동합니다.

+0

에서 짧은 문법의 질문에서. 나는 그것이 나쁘다는 것을 말하지는 않지만 질문에서 첫 번째 접근법이 실패하는 이유를 아는 것은 여전히 ​​흥미로울 것입니다. – musiKk

+0

짧은 구문은 약간 깔끔합니다. 3 arg 문제로, 나는 이것이 갈 길이되어야한다고 생각한다. – stevenl

5

\&id은 나중에 정의 될 자리 표시자를 만들기 때문에 오류가 발생한다고 생각합니다. Perl은 하위 참조에 대한 참조를 만들 때 정의 된 주소를 알고 있어야하므로이 자리 표시자를 만듭니다. Moose는 자신이 정의한 덮어 쓰기 방법을 피하기 위해 자신 만의 검사를하고 있습니다.

나는 객체가 고통 때문에 등을 사용하는 경우 당신이 정말로 id 메소드를 호출되어 수행 할 작업을 생각하기 때문에 :

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

기본적으로 옵션이있는 overload documentation

Values specified as strings are interpreted as method names.

+0

작동하지 않습니다. 여전히 오류 메시지가 나타납니다 :'Foo :: id (4 행에서 정의) 3 행 Foo :: id ('Foo = HASH (0x12ffa10)', undef , '') 12 - –

+0

@Hynek에서 호출했을 때,'overload'는 메서드에 매개 변수를 전달하는 것처럼 보입니다. Moose는이 속성을 설정하려고 시도하는 것으로 해석합니다. 따라서 응답에서했던 것처럼 중간 하위를 사용해야합니다. – cjm

+4

이 오류는 'overload'가 항상 [오버로드 - 호출 규칙] (https://metacpan.org/module/overload#Calling-Conventions-and-Magic-Autogeneration)의 메소드에 3 인수를 전달하기 때문에 발생합니다. – stevenl

관련 문제