Estoy atascado. Intento definir dinámicamente un método de clase y no puedo entender el modelo de metaclass ruby. Considere la siguiente clase:Ruby metaclass locura
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
Obviamente, ambos métodos devuelven una instancia de Clase. Pero estas dos instancias no son lo mismo. También tienen diferentes ancestros:
Example.meta.ancestors # => [Class, Module, Object, Kernel]
Example.class_instance.ancestors # => [Example, Object, Kernel]
Cuál es el punto en hacer una diferencia entre la metaclase y la instancia de clase?
Me di cuenta de que puedo send :define_method
a la metaclase para definir dinámicamente un método, pero si intento enviarlo a la instancia de la clase no funcionará. Al menos podría resolver mi problema, pero aún quiero entender por qué funciona de esta manera.
actualización Mar 15, 2010 13:40
son las siguientes hipótesis correcta.
- Si tengo un método de instancia que llama a self.instance_eval y define un método, solo afectará a la instancia particular de esa clase.
- Si tengo un método de instancia que llama a self.class.instance_eval (que sería lo mismo que llamar a class_eval) y define un método, afectará a todas las instancias de esa clase en particular, dando como resultado un nuevo método de instancia.
- Si tengo un método de clase que invoca instancia_eval y define un método, dará como resultado un nuevo método de instancia para todas las instancias.
- Si tengo un método de clase que invoca instance_eval en la clase meta/eigen y define un método, se obtendrá un método de clase.
Creo que empieza a tener sentido para mí. Ciertamente limitaría tus posibilidades si self dentro de un método de clase apuntara a la clase eigen. De ser así, no sería posible definir un método de instancia desde dentro de un método de clase. ¿Es eso correcto?
Para obtener más información sobre _why_ a 'def' dentro de un' instance_eval' define los métodos de clase, consulte este artículo http://yugui.jp/articles/846 – horseyguy
Muchas gracias hasta el momento. Actualizo mi pregunta ¿Te importaría echarle un vistazo? – t6d
Actualizado para responder preguntas en su actualización. – khelll