Я не совсем уверен в другом обходном пути, кроме remove_method
, но причина, почему то, что вы показали, не работает, заключается в том, как Ruby выполняет поиск методов.
Проверка ancestors
Foo
на каждом этапе создания 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
.
person
Mark Rushakoff
schedule
18.04.2010