メソッド定義を考える

1.クラスにメソッドを定義する

class Object
  def f()
    ...
  end
end
Object.instance_eval { define_method(:f) { ... } }

2.オブジェクトのクラスにメソッドを定義する

a.class.instance_eval { define_method(:f) { ... } }

3.オブジェクトに特異メソッドを定義する

def a.f()
  ...
end
class <<a
  def f()
    ...
  end
end
(class <<a; self; end).instance_eval { define_method(:set) {|x| @y = x } }

なにをプリミティブだと思うべきだろうか

以上から、def構文よりもdefine_methodの方が一般的であると考えられる。(instance_evalもプリミティブだと思うことにする。)define_methoddef構文の違いは後で調べる。

次はclass構文をなんとかしたい。クラスの定義は、Class.newみたいのでできたはず。しかし、特異クラスがもどかしい。そうか、RubyKaigiでeigenclassとか言ってたのは、その時点では何を言っていたのかさっぱりわからなかったんだけど、つまりこのことだったんだな。当時は、defとかclassとかをプリミティブにする方が良いと思っていたから、ピンと来なかった。

あ、eigenclassって(名前はともかくとして)導入されることで決定したんでしたっけ?決定だと嬉しいなぁ。