2011-08-29 13 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

から

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

をより短い構文の質問から。私はそれが悪いと言っているわけではありませんが、質問からの最初のアプローチが失敗する理由を知ることはまだ興味深いでしょう。 – musiKk

+0

構文が短いとややクリーンです。 3つの引数の問題で、私はこれが行く方法でなければならないと思います。 – stevenl

5

\&idは、サブクラスが参照を作成するために定義されているときに持つアドレスを知る必要があるため、後で定義するプレースホルダを\&idが作成するため、エラーが発生していると思います。 Mooseには、定義したメソッドを上書きしないようにする独自のチェックがあり、これをあなたに報告します。

私はあなたが本当にやりたいことは、オブジェクトがそのような刺すとして使用されているidメソッド呼び出しだと思うので。基本的にオプション2であるoverload documentation

Values specified as strings are interpreted as method names.

+0

動作しません。私はまだエラーメッセージが表示されています: '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

関連する問題