Object#new
newではなくinitializeを定義する。
initializeにはnewの引数がそのまま渡される。
普通はClassだけで定義してModuleでは定義しない方が混乱が少ないと思われる。
Object#==(other)
みたまんまで、selfとother同じ時にtrueを返すように定義する。
Object#<=>(other)
selfの方がotherより大きいときに正、同じ時に0、小さいときに負の整数を返すように定義します。
その後*1、Enumerableをincludeすれば<,<=,>,>=も使えるようになる。
Object#===(other)
otherがselfに所属する時にtrueを返すように定義する。
caseやgrepで使われる。
標準クラスでは以下のように定義されている。
selfがRegexpでotherがStringなら正規表現にマッチするかどうか
selfがRangeでotherが数値なら範囲に含まれるかどうか
selfがClassならotherがselfまたはその子孫のインスタンスかどうか
Object#=~(other)
===とほとんど同じだが、selfもotherもStringの時、self === Regexp.new(other)と同じ意味になる。
Object#hash
Object#eql?(other)
eql?はハッシュ用の比較をする。
eql?が真になるselfとotherはhashの値も同じでなければならない。
再定義できるメソッドはdef -(other);self+(-other);end*2のように定義する。
単項演算子はdef +@;self;endやdef -@;0-self;endのように定義する。
具体例はrational.rbやcomplex.rbを参照。
obj.equal?(other)
オブジェクトが同じかどうかを調べる。
equal?の同じとは同一ということで、変数の指しているオブジェクトが同じ、idが同じなどと言い換えることができます。
ちなみに同値判定は==を使います。
eql?はハッシュ用なので違うオブジェクトでも同じ値になることがあります。
*1def <=>より前でもいいけど、実際に<などが使われるより前にinclude Enumerableすること。
*2たぶん実際にこういう定義にしたら-@との間で再帰呼び出しになってSystemStackError: stack level too deepで落ちます。