Ruby - Можем ли мы использовать оператор include в любом месте класса? - PullRequest
4 голосов
/ 05 января 2012

Можем ли мы использовать оператор 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

1 Ответ

5 голосов
/ 05 января 2012

Когда вы включаете модуль, его методы НЕ заменяют методы, определенные в этом классе, а скорее внедряются в цепочку наследования. Поэтому, когда вы вызываете 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

Подробнее см. в этом посте .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...