2012-01-14 3 views
0

Например, мы имеем:Почему метод не переопределяется?

module X 
def test 
    "X" 
end 
end 

module Y 
def test 
    "Y" 
end 
end 

class L 
include X 
end 

L.new.test #=> "X" 

class L 
include Y 
end 

L.new.test #=> "Y" 

class L 
include X 
end 

L.new.test #=> "Y" 

Вот странная вещь. Почему последнее включение не изменило метод на метод X?

ответ

2

Ruby не позволяет включить один модуль дважды, попытка сделать это второй раз просто игнорируется.

Из документации Module#append_features, которая используется Module#include под одеялом:

реализация Руби по умолчанию является добавление константы, методы и модуль переменных этого модуля мод, если этот модуль не был добавлен мод или один из его предков.

+0

Но почему он вызывает обратный вызов модуля «включено» каждый раз, когда модуль входит в класс? – megas

+0

Посмотрите на источник 'Module # include'. Сначала он вызывает 'append_features', а затем, независимо от того, действительно ли он был включен в него или нет, вызывает« включенный »hook. –

Смежные вопросы