Я не совсем уверен, что есть обходной путь, отличный от remove_method
, но причина почему показанное вами не работает в том, что Ruby выполняет метод поиск.
Проверка Foo
ancestors
на каждом этапе создания Foo
дает нам большой совет:
module One
def test; puts 'Test One'; end
end
module Two
def test; puts 'Test Two'; end
end
class Foo
include One
p ancestors
include Two
p ancestors
include One
p ancestors
end
Вывод:
[Foo, One, Object, Kernel]
[Foo, Two, One, Object, Kernel]
[Foo, Two, One, Object, Kernel]
Если модуль уже находится в предке класса, Ruby не позволяет вам снова включить его. Таким образом, когда Two
включено после One
, Two
встречается в таблице поиска Foo
до того, как One
имеет шанс, независимо от того, сколько раз вы включаете One
.