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”是输出,因为这是顺序:
-
Sample
扩展了Foo
,initialize
从Foo
inheritance -
Sample
包括Bar
,initialize
被覆盖 -
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世界