ruby包括问题

class Foo def initialize(a) puts "Hello #{a}" end end module Bar def initialize(b) puts "#{b} World" end end class Sample  qux World 

为什么输出不是’Hello qux’? 代码的功劳

当您将一个模块包含到一个类中时,它就像您在类层次结构中插入一个新的超类一样,就在Sample和Foo之间。 调用super()捕获包含的模块,然后再回到真正的超类(Foo)。

简短的回答是,如果输出是“Hello World”,那将是绝对疯狂的谈话。 唯一有意义的两个输出是“Hello qux”或“qux World”。 在这种情况下,“qux World”是输出,因为这是顺序:

  1. Sample扩展了FooinitializeFooinheritance
  2. Sample包括Barinitialize被覆盖
  3. Sample定义了initialize ,它调用super ,它指向最近祖先的initialize实现,在本例中是Bar

这应该有希望使它更清楚:

 class Foo def initialize(a) puts "Hello #{a}" end end module Bar def initialize(b) super # this calls Foo's initialize with a parameter of 'qux' puts "#{b} World" end end class Sample < Foo include Bar def initialize(c) super # this calls Bar's initialize with a parameter of 'qux' end end Sample.new('qux') 

输出:

你好qux
 qux世界