Compreso un modulo lo mette sopra il modulo/classe che lo include nella gerarchia di classi. In altre parole, A # foo non è super di B # pippo ma piuttosto il contrario.
Se si pensa di includere un modulo come modo di fare ereditarietà, questo ha senso, include SomeModule
è un modo per dire "Tratta SomeModule come se fosse una classe genitore per me".
per ottenere il risultato che volevi è necessario invertire l'inserimento in modo che B comprende una:
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
Modifica in risposta al commento:
Allora o includono sia A che B in C con B incluso dopo A:
# A and B as before without including B in A.
class C
include A
include B
end
o patch A in C e non disturbare con B.
# A as before, no B.
class C
include A
def foo; puts 'B'; super; end
end
L'unico modo per far funzionare tutto è se il metodo di ricerca su C è C -> B -> A e non c'è modo di fare questo senza includere B in C.
Questo era un caso "alias_method_chain'. – clyfe