Estoy muy confundido por el comportamiento de Ruby al definir const_missing
y otros métodos de clase dentro de una definición class << self
en lugar de usar la sintaxis def self.foo
.Missing constant y "const_missing" dentro de la definición "class << self"
yo estaba tratando de hacer algo como esto:
class Foo
class << self
def foo
puts MISSING
end
def const_missing(name)
puts "#{name} missing"
end
end
end
Foo.foo
sobre todo me usan la sintaxis de la class << self
para definir los métodos de clase. Sin embargo, no funcionó como se esperaba. const_missing
nunca se llama. Lo anterior da como resultado un NameError.
Definición de ambos métodos como esto funciona como se espera:
def self.foo
puts MISSING
end
def self.const_missing(name)
puts "#{name} missing"
end
pensé que la sintaxis class << self
es sólo otra manera de definir los métodos de clase, pero completamente equivalente a def self.foo
? He probado lo anterior con MRI 1.8.7, 1.9.2 y JRuby 1.5.6. Entonces, obviamente me falta algo aquí?
Cualquier sugerencia es muy apreciada.
Gracias, Martin
Muchas gracias, LBG. Sabía que 'class << self' abre la clase propia de una clase. Pero como los métodos de clase son solo métodos de instancia de la clase de genes, pensé que funcionaría de esta manera. Sin embargo, tiene mucho sentido que una constante a la que se hace referencia desde la clase de origen no sea lo mismo que una constante a la que se hace referencia desde la propia clase. A veces todo esto hace que mi cabeza gire :) – martido