Pixel Pedals of Tomakomai

北海道苫小牧市出身の初老の日常

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を使いましょうってことになるかと(笑)。