Perlで演算子オーバーロードを自習した
わけがわからない
オブジェクト指向Perlマスターコース―オブジェクト指向の概念とPerlによる実装方法
- 作者: ダミアンコンウェイ,Damian Conway,山根ドキュメンテーション
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2001/02
- メディア: 単行本
- 購入: 6人 クリック: 154回
- この商品を含むブログ (37件) を見る
クラスを自作すると綺麗に整形された文字列を返すリッチなtoStringがなさげなのがはらたって、ひとまずJavaでhashCode、toStringにあたるメソッドを持った自作クラス用共通の基底クラス書いて、毎度これを継承させてクラス作ろうと思ったのだけど、
毎度毎度、陽に
$inst->hashCode
だの、
$inst->toString
よぶのがウザすぎるし、q{""}と0+をオーバーロードしようと思った。
やっつけで他クラスから継承して使う前提な文字列化可能クラスを作った。
use strict; use warnings; { package Stringizable; use overload q{""} => 'toString', fallback => 0; sub new { bless {}, $_[0]; } sub toString { my $this = shift; __PACKAGE__ . '(' . ($this+0) . ")\n" # ◎ . join "\n ", map {"$_ = $this->{$_}"} sort keys %$this; } }
問題は◎で、$this+0のところでhashCodeメソッドを書いてアドレスを返させて0+をオーバーロード
したいが、何やら再帰深過ぎのエラーが出たり、はたまた+がオーバーロードされてないじゃん、のエラーが出たりして、どのようにすればかっちりとしたhashCodeとtoString相当を作れるのかとんとわからん!
基本的にウザさを除きたいだけだから、実現できないなら諦めて毎回陽にメソッドを呼ぶしかないのかしら。