红宝石包含问题

红宝石包含问题

问题描述:

class Foo 
    def initialize(a) 
    puts "Hello #{a}" 
    end 
end 
module Bar 
    def initialize(b) 
    puts "#{b} World" 
    end 
end 
class Sample < Foo 
    include Bar 
    def initialize(c) 
    super 
    end 
end 
Sample.new('qux') #=> qux World 

为什么输出不是'Hello qux'? credit for code红宝石包含问题

当你将一个模块包含到一个类中时,它就像你在类层次结构中插入一个新的超类一样,就在Sample和Foo之间。调用super()在返回真实超类(Foo)之前通过包含的模块搜索。

简短的回答是,如果输出结果是“Hello World”,那将是绝对的疯狂说法。只有两个有意义的输出是“Hello qux”或“qux World”。在这种情况下, “qux世界” 是输出,因为这是为了:

  1. Sample延伸FooinitializeFoo
  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') 

输出:

 
Hello qux 
qux World