読者です 読者をやめる 読者になる 読者になる

kiyo_hikoのブログ

メモ+日記?

Perlで演算子オーバーロードを自習した

わけがわからない

オブジェクト指向Perlマスターコース―オブジェクト指向の概念とPerlによる実装方法

オブジェクト指向Perlマスターコース―オブジェクト指向の概念とPerlによる実装方法


クラスを自作すると綺麗に整形された文字列を返すリッチな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相当を作れるのかとんとわからん!
基本的にウザさを除きたいだけだから、実現できないなら諦めて毎回陽にメソッドを呼ぶしかないのかしら。