北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

use overloadとリファレンス

例えば、Hogeクラスのインスタンスをプリントすると、Hoge=HASH(0x274e78)のようにリファレンスのアドレスが表示されますが、


package Hoge;
use overload ('""' => 'hello');
sub hello{'hello'}

なんてやると、このインスタンスをprintしてもhelloとしか表示できなくなってしまいます。普通は困らないですが、デバグのときにリファレンスが同じところを指しているのか別のところを指しているのか簡単にわからないのは辛い。

で、考えました。bless解除すればいいと。


my $orig = ref($hoge);
bless $hoge, 'FooFooFoo';
print "$hoge\n";
bless $hoge, $orig;

これでFooFooFoo=HASH(0x274e78)と表示されます。でも、あまりに卑劣なやり方だ。。。

と思ったら、Scalar::Util::refaddrのXSが使えないときの実装がこうでした。XS使えないとこうするしかないのかも。


あ、結論としては、overloadで文字列化関数が標準ではなくなってしまっているオブジェクトには、小細工せずにScalar::Util::refaddrを使いましょうってことになるかと(笑)。