私は立ち往生しています。クラス メソッドを動的に定義しようとしていますが、Ruby メタクラス モデルについて頭を悩ませることができません。次のクラスを検討してください。
class Example
def self.meta; (class << self; self; end); end
def self.class_instance; self; end
end
Example.class_instance.class # => Class
Example.meta.class # => Class
Example.class_instance == Example # => true
Example.class_instance == Example.meta # => false
明らかに、両方のメソッドが Class のインスタンスを返します。しかし、これら 2 つのインスタンスは同じではありません。また、祖先も異なります。
Example.meta.ancestors # => [Class, Module, Object, Kernel]
Example.class_instance.ancestors # => [Example, Object, Kernel]
メタクラスとクラス インスタンスを区別する意味は何ですか?
メソッドを動的に定義するためにメタクラスにできることがわかりましたsend :define_method
が、それをクラスインスタンスに送信しようとすると機能しません。少なくとも私は自分の問題を解決できましたが、なぜこのように機能しているのかを理解したいと思っています。
2010 年 3 月 15 日 13:40 更新
次の仮定は正しいですか。
- self.instance_eval を呼び出してメソッドを定義するインスタンス メソッドがある場合、そのクラスの特定のインスタンスにのみ影響します。
- self.class.instance_eval (class_eval の呼び出しと同じ) を呼び出すインスタンス メソッドがあり、メソッドを定義すると、その特定のクラスのすべてのインスタンスに影響し、新しいインスタンス メソッドが生成されます。
- instance_eval を呼び出してメソッドを定義するクラス メソッドがある場合、すべてのインスタンスに対して新しいインスタンス メソッドが作成されます。
- meta/eigen クラスで instance_eval を呼び出してメソッドを定義するクラス メソッドがある場合、クラス メソッドになります。
私はそれが私にとって意味を持ち始めていると思います。クラスメソッド内の self が固有クラスを指す場合、可能性は確かに制限されます。その場合、クラス メソッド内からインスタンス メソッドを定義することはできません。あれは正しいですか?