2009-10-29 92 views
4
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紅寶石包含問題

回答

10

當你將一個模塊包含到一個類中時,它就像你在類層次結構中插入一個新的超類一樣,就在Sample和Foo之間。調用super()在返回真實超類(Foo)之前通過包含的模塊搜索。

2

簡短的回答是,如果輸出結果是「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