Rubyの定石

クラス作成の定石

必要に応じて再定義が期待されているメソッド

Object#new

newではなくinitializeを定義する。 initializeにはnewの引数がそのまま渡される。

普通はClassだけで定義してModuleでは定義しない方が混乱が少ないと思われる。

Object#==(other)

みたまんまで、selfother同じ時にtrueを返すように定義する。

Object#<=>(other)

selfの方がotherより大きいときに正、同じ時に0、小さいときに負の整数を返すように定義します。

その後*1Enumerableincludeすれば<,<=,>,>=も使えるようになる。

Object#===(other)

otherselfに所属する時にtrueを返すように定義する。 casegrepで使われる。 標準クラスでは以下のように定義されている。

Object#=~(other)

===とほとんど同じだが、selfotherStringの時、self === Regexp.new(other)と同じ意味になる。

Object#hash
Object#eql?(other)

eql?はハッシュ用の比較をする。 eql?が真になるselfotherhashの値も同じでなければならない。

演算子

再定義できるメソッドはdef -(other);self+(-other);end*2のように定義する。 単項演算子はdef +@;self;enddef -@;0-self;endのように定義する。

具体例はrational.rbやcomplex.rbを参照。

わかりにくいもの

メソッド

obj.equal?(other)

オブジェクトが同じかどうかを調べる。 equal?の同じとは同一ということで、変数の指しているオブジェクトが同じ、idが同じなどと言い換えることができます。 ちなみに同値判定は==を使います。 eql?はハッシュ用なので違うオブジェクトでも同じ値になることがあります。


上へ indexへ
copyright © 2000 ZnZ

*1def <=>より前でもいいけど、実際に<などが使われるより前にinclude Enumerableすること。
*2たぶん実際にこういう定義にしたら-@との間で再帰呼び出しになってSystemStackError: stack level too deepで落ちます。