好像如果你正在尋找能夠調用一個模塊(/班),你正在尋找一個單身方法......如果是這樣的話,你使用類方法或Singleton
的更好mixin(不尋找答案,哪一個是「更好」)。Module#module_function被認爲是壞的嗎?
唯一的好處(?)我可以使用#module_function
看到的是模塊以及模塊上調用方法在混合的靈活性。還有別的事嗎?
我發現一些舊代碼,用來工作< 1.9.3跑,但不會再和我期待解決。它看起來是這樣的:
module MyThing
def self.do_something
...
end
end
...並允許:
MyThing.do_something
我並不想爭辯說,這樣的設計是一個很好的 - 只是試圖找出什麼最好的辦法是解決它。傾向於一個標準模塊...
更新...
我錯誤地簡化了我的問題和榜樣。我正在經歷的不同行爲是在我的RSpec測試期間 - 他們通過使用RSpec 2.8.0和MRI 1.9.2,但通過MRI 1.9.3失敗。該模塊的樣子:
module MyThing
module SubThing
module SubSubThing
def self.do_something
...
end
end
end
end
...和測試:
describe MyThing::SubThing::SubSubThing do
include MyThing::SubThing
describe "#do_something" do
it "does something" do
SubSubThing.do_something
end
end
end
在1.9.3下運行的規範,我得到NameError: uninitialized constant DataGathering
;在1.9.2下,他們通過。這導致我錯誤地診斷問題,並呈現我在上面做了什麼。好像include
行爲在1.9.3中不同。沒關係;我的問題仍然存在:#module_function
提供了一些特別的東西嗎?
你舉的例子在這裏工作 - 運行紅寶石1.9.3dev(2011-09-23修訂33323)x86_64的-darwin11.0.0。 – user2398029 2012-02-13 19:10:25
感謝您的檢查;這讓我意識到我錯誤地診斷了這個問題。我已更新以描述真正的問題。 – turboladen 2012-02-13 21:48:20
FWIW,看起來像我的1.9.2 v。1.9。3問題被記錄爲[1.9.3錯誤](http://bugs.ruby-lang.org/issues/5657)(最初[由Matz記錄](http://bugs.ruby-lang.org/issues/4536)),但結果是一個1.9.2的錯誤。去搞清楚。 – turboladen 2012-02-14 00:54:59