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で落ちます。