2012-01-05 2 views
4

Можно ли использовать оператор include для включения модуля в любом месте класса или он должен быть в начале класса?Ruby - Можно ли использовать инструкцию include внутри класса?

Если я включаю модуль в начале объявления класса, метод переопределяет работу, как ожидалось. Почему он не работает, если я включаю в конец, как описано ниже?

# mym.rb 
module Mym 
def hello 
    puts "am in the module" 
end 
end 

# myc.rb 
class Myc 
require 'mym' 

def hello 
    puts "am in class" 
end 

include Mym 
end 
Myc.new.hello 
=> am in class 

ответ

5

При включении модуля, его методы делают НЕ заменить методы, определенные в этом классе, а они впрыскивают в наследство цепи. Таким образом, когда вы вызываете super, метод из включенного модуля вызывается.

Они будут вести себя практически так же, как и другие модули. Когда модуль включается, он помещается прямо над классом в цепочке наследования с существующими над ним модулями. Смотрите пример:

module Mym 
def hello 
    puts "am in the module" 
end 
end 

module Mym2 
def hello 
    puts "am in the module2" 
    super 
end 
end 

class Myc 
include Mym 
include Mym2 

def hello 
    puts "im in a class" 
    super 
end 
end 

puts Myc.new.hello 
# im in a class 
# am in the module2 
# am in the module 

Для получения дополнительной информации см this post.

Также читайте это: http://rhg.rubyforge.org/chapter04.html

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