我正在閱讀'Metaprogramming Ruby',並同時編寫一些代碼以闡明概念。我已經讀過,當你多次包含/預先安裝一個模塊時,所有進一步的包含都不會改變祖先鏈中所述模塊的位置。Ruby - 包括單個模塊多次和祖先層次結構
我寫了一些代碼,它的工作方式我沒有想到 - 實際發生了什麼?
module GreatGrandfather; end
module Grandfather
include GreatGrandfather
end
module Father
include Grandfather
prepend GreatGrandfather
end
module Son
include Father
end
Son.ancestors # => [Son, Father, Grandfather, GreatGrandfather]
我認爲當我運行Son.ancestors
,兒子將包括父親,父親將包括祖父和曾祖父預先考慮和祖先樹將被設置爲[Son, GreatGrandfather, Father, Grandfather]
。顯然這沒有發生。
一旦兒子包括父親,它開始在父模塊中查找並找到include Grandfather
和prepend GratGrandfather
。它實際上'進入'Grandfather
它包括GreatGrandfather,只有然後執行prepend GreatGrandfather
線(並忽略它,因爲它已經存在於血統)?
真相被告知,我懷疑我會從中得到多少用處,但不會因爲知道模塊彼此「鏈」的確切程度而受到傷害。
@edit - 我多花了一些時間,而且在任何情況下,我的直覺似乎都沒有錯。我已經包含了我認爲可以實現的兩種方式的圖片,一種是指令後的指令,另一種是關於創建繼承層次的圖片 - 看起來發生在圖片中的那種方式與給出的原始示例背道而馳,所以#1或#2都不能正在發生。
修改的示例代碼(僅曾祖父改變)
module GreatGrandfather
include Grandfather
end
module Grandfather
include GreatGrandfather
end
module Father
prepend GreatGrandfather
include Grandfather
end
module Son
include Father
end
Son.ancestors # => Son, GreatGrandfather, Father, Grandfather
在總結 - 我仍然不知道是怎麼回事了
謝謝您的回答,雖然說實話它並不十分清楚。我已經添加了一些更多的信息信息 - 你可以稱重嗎? – blob
呵呵,我實際上只是自己弄明白了,因爲我完全忽略了模塊中的代碼立即執行。我一直在玩它,所以我錯過了它抱怨單一化常量 - 如果我把它放在一個文件中,這個問題從一開始就會有明確的答案。謝謝! – blob