我試圖更好地理解模塊如何擴展和包含對方。Ruby:模塊擴展/包括模塊
說我有模塊一個:
module A
def learned_from_A
true
end
end
A.instance_methods # [:learned_from_A]
我的錦囊混入乙:
module B
extend A
end
B.learned_from_A # true
我天真地試圖給ç一切乙已:
module C
extend B
end
C.learned_from_A # NoMethodError
我想我已經把我的頭包裹在裏面了。
B.singleton_methods # [:learned_from_A]
雖然::當乙延伸甲,的A的實例方法的拷貝經由B的單個類勢必乙 learned_from_A是乙可調用,這不是B的一個的實例方法,所以當ç延伸乙,:learned_from_A是不是複製到C。
如果乙不得不代替包括一個,的的實例方法副本會一直被列入B的自己的實例方法之一。
module B
include A
end
B.instance_methods # [:learned_from_A]
然後,Ç可以乙,並且所有的B的實例方法(包括:learned_from_A)延伸將被複制並綁定到Ç。
module C
extend B
end
C.singleton_methods # [:learned_from_A]
爲了使:learned_from_A可調用二者B關於和Ç,乙可以延伸和包括甲。
module B
include A
extend A
end
B.instance_methods # [:learned_from_A]
B.singleton_methods # [:learned_from_A]
module C
extend B
end
C.instance_methods # []
C.singleton_methods # [:learned_from_A]
更爲現實的,如果我想一個的方法可以被調用於乙,併爲乙定義自己的另一種方法和能夠混合整個劇目爲ç,我不能做到這一點:
module B
extend A
include A
def self.buzz
true
end
end
module C
extend B
end
B只能共享其實例方法,而不是其單例方法。因此,爲了使兩者在乙可贖回和可共享到其他對象的方法,它必須被定義爲實例方法,並擴展到乙本身:
module B
extend A
include A
extend self
def buzz
true
end
end
module C
extend B
end
有試驗了相當數量的並把這一切放在一起的錯誤。這是一種查看正在發生的事情的準確方法嗎?
有什麼方法可以簡化您的問題嗎?即使你將它放在調試出的不同場景的要點上。 – onebree
我想你可能會混淆自我的範圍變化,當你在B裏面擴展A,然後期待C會有A.你可以改變範圍。還有#prepend可以被調用。 要查看這些範圍如何變化,請在您的班級上調用$ ancestors方法。 –
聽起來像你想打電話給媽媽和女兒同名:P –