incluye un módulo de lugares que anteriormente el módulo/clase que está incluida en la jerarquía de clases. En otras palabras, A # foo no es super de B # foo sino más bien al revés.
Si se piensa que incluye un módulo como una forma de hacer herencia múltiple que esto tenga sentido, include SomeModule
es una forma de decir, "Tratar SomeModule como es una clase padre para mí".
Para obtener el resultado que quería tener que anular la inclusión de manera que B incluye R:
module A
def foo; puts 'A' end
end
module B
def foo; puts 'B'; super; end
end
B.module_eval { include A } # Reversing the inclusion
class C
include B # not include A
end
puts C.new.foo
Editar en respuesta a comentar:
Entonces, o incluyen tanto A como B en C con B incluido después de A:
# A and B as before without including B in A.
class C
include A
include B
end
o parche A en C y no molestar con B.
# A as before, no B.
class C
include A
def foo; puts 'B'; super; end
end
La única manera para que esto funcione es que si la búsqueda método en C es C -> B -> A y no hay manera de hacer esto sin incluir B en C.
Este fue un caso 'alias_method_chain'. De hecho – clyfe