UNIVERSAL::isa($hoge, 'Huga') を使うべきではない
ことの理由と出典をいつも忘れてしまうので,メモメモ。
if ($obj->isa('Huga')) { ...... }
みたいなコードはよく使うんですが,$obj が bless されたオブジェクト(か,クラス名の文字列スカラー)じゃないとエラーを吐くので,一時期,以下のように書いてました。
if (UNIVERSAL::isa($obj, 'Huga')) { ...... }
でもそれはイカーン,とどこかで読んだような気がして探してたら,「続・初めてのPerl 改訂版」の「14.2 オブジェクトの動作に関するテスト(pp.186-188)」に書いてありました。
しかし,これではオブジェクト指向メカニズムを否定することになり,それはそれで問題を起こします(→脚注)。
- 脚注
- 特に,Animal がカスタムの isa メソッドを持つ場合(中略),UNIVERSAL::isa を呼び出してしまうと,Animal::isa を無視してしまいますから,間違った答えが返ってくる場合があります。
いつもそうだよねそうだよね,でも独自 isa をインプリメントするモジュールなんてそんなにないべ,とか考えて頭をすぐスルーしてしまうんでなかなか覚えられないのでした。
どうすべきかというと,単に eval で囲うだけ
if (eval { $obj->isa('Hoge') } ) { ...... }
うす,日記に書いたからもう忘れないメソッド。
これくらいだと正当な引用に入りますよね……後ろめたいので,この例以外にもお役立ちな原典へのアサマしくないリンクを張っておきます。タイトルにだまされがちですが,中級者なら一度は読んでおくべき本だと思います。ページ数に比してちょっとお高めだけど。
- 作者: Randal L. Schwartz,brian d foy,Tom Phoenix,吉川英興,伊藤直也,田中慎司,株式会社ロングテール/長尾高弘
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2006/10/21
- メディア: 大型本
- 購入: 9人 クリック: 389回
- この商品を含むブログ (99件) を見る