2010-10-03 93 views
9

當類在Ruby中都繼承了單類也繼承:爲什麼Ruby模塊包含排除模塊的單例類?

class A 
    def self.hello 
    puts "hello" 
    end 
end 

class B < A 
end 

B.hello #=> "hello" 

然而,隨着模塊,這種情況並非如此:

module M 
    def self.goodbye 
    puts "goodbye" 
    end 
end 

class A 
    include M 
end 

A.goodbye #=> NameError 

爲了避開這一限制多脂肪酶求助於這個醜陋破解:

module M 
    def self.included(c) 
    c.extend ClassMethods 
    end 

    module ClassMethods 
    def goodbye 
     puts "goodbye" 
    end 
    end 
end 

好吧,所以我的問題:是否有一個理論/概念原因背後的這種限制的模塊?還是僅僅是一個執行困難?我看過C源代碼(YARV/MRI)後可以確定是否存在執行困難(不是無法克服,但完全相同),但這是唯一原因嗎?這種限制是否有其他原因?

謝謝

+0

他們爲什麼要工作?包含模塊與繼承類不是一回事。 – 2010-10-03 15:36:39

+0

@Mladen,我不買這個。如果概念上的區別非常明確,那麼爲什麼人們(即使是非常頂級的Ruby程序員)都試圖通過使用'ClassMethods'破解來繞過這個限制?此外 - 爲什麼它如此愚蠢,以某種方式模塊的本質意味着這個特殊的限制。 – horseyguy 2010-10-03 19:35:32

+0

恕我直言,模塊mixins!=多重繼承,所以無論有人可能做什麼都不能證明任何東西。順便說一下,你能否通過一個真實世界的例子來說明黑客攻擊的必要性,例如,通過包含模塊「A」並通過模塊「B」擴展,無法達到相同目的? – 2010-10-04 13:27:40

回答

0

警告:以下只是推測。

如果您使用的是類,則需要單例類方法,因爲您依賴它們來創建對象(例如MyClass.new)。如果您使用的是模塊,則不需要它們,因爲您無法純粹從模塊創建對象。

+0

singleton方法可以用來創建對象;我不認爲這可能是原因,但謝謝:) – horseyguy 2010-10-03 13:40:42

1

除非任何人能夠提出令人信服的論點,否則我覺得這個限制只是執行困難。儘管如此,我在過去幾天一直在研究這個問題,並且已經在(測試版)中包含一個名爲include_complete的新版本,它解決了這些困難,並允許模塊繼承像類繼承一樣工作(引入單例)

看看這裏的項目:http://github.com/banister/include_complete

並提防該項目仍處於測試階段非常多,但似乎仍然是到目前爲止所需