特異メソッドの例にはどんなのがいいか

特異メソッドというのは、インスタンス特異的メソッドの Ruby におけるローカルな呼び名。Rubyist Magazine - 0002号で、特異メソッドの記事にある七並べを使った特異メソッドの例があまりよくないという話があるようです。個人的には、特異メソッドの一番シンプルで分かりやすい例は「ゼロか、そうでないか」メソッドの実装だと思っていて、好んで使っています。

次は、Ruby が特異メソッドを用意するにあたり、その概念的な参考とされたと言われる CLOS で、インスタンス特異的メソッドを実現する EQL スペシャライザを使用し、「ゼロか、そうでないか」関数“is-zero”(ま、本当にゼロ判定をしている zerop はすでにあるので)を書いた例です。

(defmethod is-zero (self) NIL)
(defmethod is-zero ((self (eql 0))) T)
(is-zero 0)   ;;=> T
(is-zero 1)   ;;=> NIL
(is-zero "a") ;;=> NIL
(is-zero (lambda (x) (+ x x))) ;;=> NIL

ところが、Ruby だとこれが実現できないんですね(^_^;)。

def is_zero; false end
def 0.is_zero; true end   #=> error

Ruby、駄目じゃん!(ニヤリ)とか思ったら、SELF も駄目でした(爆)。

defaultBehavior _AddSlots: (| isZero = false |)
0 _AddSlots: (| isZero = true |)         "=> error "

ま、考えたら当たり前なんですけどね。


オマケ(Squeak の場合)

0 assureUniClass   "=> error "