好像如果你正在寻找能够调用一个模块(/班),你正在寻找一个单身方法......如果是这样的话,你使用类方法或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