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