Я застрял. Я пытаюсь динамически определить метод класса, и я не могу обернуть голову вокруг модели метакласса 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
Очевидно, оба метода возвращают экземпляр класса. Но эти два случая не то же самое. У них также есть разные предки:
Example.meta.ancestors # => [Class, Module, Object, Kernel]
Example.class_instance.ancestors # => [Example, Object, Kernel]
В чем смысл разницы между метаклассом и экземпляром класса?
Я понял, что могу send :define_method
метакласса динамически определять метод, но если я попытаюсь отправить его в экземпляр класса, это не сработает. По крайней мере, я мог бы решить свою проблему, но я все же хочу понять, почему она работает именно так.
Обновление от 15 марта 2010 г. 13:40
Правильны ли следующие допущения.
- Если у меня есть метод экземпляра, который вызывает self.instance_eval и определяет метод, он будет влиять только на конкретный экземпляр этого класса.
- Если у меня есть метод экземпляра, который вызывает self.class.instance_eval (который будет таким же, как вызов class_eval) и определяет метод, он будет влиять на все экземпляры этого конкретного класса, что приведет к новому методу экземпляра.
- Если у меня есть метод класса, который вызывает instance_eval и определяет метод, он приведет к новому методу экземпляра для всех экземпляров.
- Если у меня есть метод класса, который вызывает instance_eval в классе meta/eigen и определяет метод, он приведет к методу класса.
Я думаю, что это начинает иметь смысл для меня. Это, безусловно, ограничит ваши возможности, если я внутри метода класса будет указывать на собственный класс. Если это так, было бы невозможно определить метод экземпляра внутри метода класса. Это правильно?