2012-03-22 15 views
11

Acabo de enfrentar este comportamiento que realmente no entiendo.Ruby mixin override método de aclaración

module M 
    def foo 
    "module_foo" 
    end 
end 

class C 
    def foo 
    "class_foo" 
    end 
    include M 
end 

puts C.new.foo 

¿Por qué C.new.foo vuelven en realidad class_foo? Estaba bastante seguro de que el método debe ser anulado por el que está en el módulo. Otra cosa, en sustitución de "class_foo" con super hace C.new.foo retorno ` "module_foo"

que en realidad se parece de alguna manera está incluido el módulo antes de definir el método de instancia de clase. ¿Podrías aclararlo por favor?

Respuesta

14

De de programación Ruby sección sobre mixins:

De hecho, los módulos mixtos en-comportan de manera efectiva como superclases.

Así que lo que experimentas es normal. su módulo M es una superclase de la clase C

lo tanto, su método foo en la clase C reemplaza el método foo en módulo M

+0

heh, tan obvio. ¡¡Gracias!! –

3

Así es como el rubí hace método de búsqueda: Clase Singleton

  1. del receptor;
  2. clase del receptor;
  3. cualquier método de módulos incluidos;
  4. repite la búsqueda en la superclase del receptor;
  5. si no se encontró ningún método, method_missing call;

Puede encontrar más detalles aquí: http://ruby-metaprogramming.rubylearning.com/html/ruby_metaprogramming_2.html

Por lo tanto, encontrar un método, Ruby va en la clase del receptor, y desde allí se sube por la cadena de antepasados ​​hasta que encuentra el método. Este comportamiento también se denomina regla de "un paso hacia la derecha, luego hacia arriba" : avance un paso hacia la derecha en la clase del receptor, y luego hacia arriba cadena de antepasados, hasta que encuentre el método. Cuando incluye un módulo en una clase (o incluso en otro módulo), Ruby crea una clase anónima que envuelve el módulo e inserta la clase anónima en la cadena, justo encima de la clase incluida.

+1

method_missing no se comprueba hasta después de caminar todos los antepasados ​​ – dbenhur

+0

¡Gracias por notar eso, simplemente lo arregló! – andersonvom

+1

0. clase singleton del receptor; –