2015-05-28 70 views
1

我想製作一個課程,或者可以使用「require」或「require_relative」加載/需要的模塊。但是,爲了簡單起見,我不想實例化任何對象,只是開始使用它的方法,類似於Ruby的Prime類。我怎樣才能做到這一點?如何在Prime類中創建Ruby中的默認實例?

require "my_module" 
puts My_module.convert("data") 

取而代之的是:

require "my_module" 
an_instance = My_module::My_class.new 
puts an_instance.convert("data") 

http://ruby-doc.org/stdlib-1.9.3/libdoc/prime/rdoc/Prime.html

+0

「......我不希望任何實例化對象,......」似乎有矛盾的問題的標題。 '需要「my_module」;放入My_module.convert(「data」)'如果'convert'是一個模塊方法,就可以正常工作:'module My_module; def self.convert(str)...'。那是你在找什麼? –

回答

3

Prime類使用singleton pattern實現這一行爲,那麼uses a clever trick使所有的實例方法看起來好像他們是類方法。但是,我真的不明白爲什麼這樣做。如果需要保持一些全局狀態,單例模式會很有用,但Prime類並沒有真正使用它。有人說單身人士是最被濫用的模式,他們可能是對的。

我現在只是猜測你的轉換器不需要保持全局狀態。遵循這個假設,您可以使用模塊方法來實現您所描述的API。例如:

module MyModule 
    def self.convert(data) 
    MyClass.new.convert(data) 
    end 
end 

然後,您可以調用此方法

MyModule.convert("data") 
+0

很好的答案。我需要一些安靜的時間來理解「聰明的把戲」。 –

+0

現在我再次想到,也許Prime類實際上在前一段時間使用了全局狀態,現在它們只是爲了向後兼容而保留單例。 –

+0

@CarySwoveland它其實並不複雜,除了一件事。每次定義一個實例方法時,這段代碼都會定義一個具有相同名稱的類方法,該方法只會委派給單例實例。現在最困難的部分是:它使用'Forwardable'模塊來實現此目的,這意味着將實例方法委託給另一個對象。但是由於我們想要委託類方法,我們需要得到「更高的水平」。這是通過通過'(class << self; self; end)'獲得元類來完成的,並使用'def_delegator'來代替類本身。 –