6

2 つの (非公式な) インターフェイスを実装するオブジェクトのポリモーフィック配列があります。次の行に沿って反射してそれらを区別できるようにしたい:

if (hasattr(obj, 'some_method')) {
    # `some_method` is only implemented by one interface.
    # Now I can use the appropriate dispatch semantics.
} else {
    # This must be the other interface.
    # Use the alternative dispatch semantics.
}

たぶん、このようなものが機能しますか?:

if (*ref(obj)::'some_method') {
    # ...

構文がサブルーチンを呼び出そうとするタイミングと、サブルーチン参照を返すタイミングを判断するのは困難です。私はパッケージ シンボル テーブル ATM にあまり詳しくなく、何かをハックしようとしているところです。:-)

前もって感謝します!

4

1 に答える 1

16
use Scalar::Util qw(blessed);
if( blessed($obj) and $obj->can('some_method') ){ 

}

ここでの「can」は、UNIVERSALからすべてのクラスに継承されるメソッドです。クラスはこのメソッドをオーバーライドできますが、お勧めできません。

また、「can」は関数への参照を返すため、次のことができます。

$foo->can('some_method')->( $foo , @args );

また

my $sub = $foo->can('some_method'); 
$foo->$sub( @args ); 

Brian Phillips のおかげで、更新されたチェーン構文を編集

于 2009-01-20T10:07:42.683 に答える