Включение модуля помещает его выше модуля / класса, который включает его в иерархию классов. Другими словами, A # foo не супер B # foo, а наоборот.
Если вы думаете о включении модуля в качестве способа выполнения множественного наследования, это имеет смысл, include SomeModule
- это способ сказать: «Обращайтесь с SomeModule, как будто это родительский класс для меня».
Чтобы получить желаемый результат, вам нужно отменить включение, чтобы B включало A:
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
Редактировать в ответ на комментарий:
Затем либо включите и A, и B в C, а B включите после A:
# A and B as before without including B in A.
class C
include A
include B
end
или исправьте A в самой C и не беспокойтесь о B.
# A as before, no B.
class C
include A
def foo; puts 'B'; super; end
end
Единственный способ для этого - если поиск метода на C - это C -> B -> A, и нет способа сделать это без включения B в C.