Ruby - 我们可以在类中的任何位置使用include语句吗?

时间:2012-01-05 10:16:51

标签: ruby-on-rails ruby oop

我们可以使用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 个答案:

答案 0 :(得分:5)

当你包含一个模块时,它的方法做 NOT 替换这个类中定义的方法,而是将它们注入到继承链中。因此,当您调用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