红宝石包含问题
问题描述:
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世界” 是输出,因为这是为了:
-
Sample
延伸Foo
,initialize
从Foo
-
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')
输出:
Hello qux qux World