gpt4 book ai didi

ruby - 使用 Module#module_function 被认为是不好的吗?

转载 作者:太空宇宙 更新时间:2023-11-03 18:27:14 25 4
gpt4 key购买 nike

似乎如果您希望能够调用模块(/类)上的方法,那么您正在寻找一个单例...如果是这种情况,您最好使用类方法或Singleton mixin(不寻找其中一个“更好”的答案)。

我在使用 #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 是否提供了一些特别的东西?

最佳答案

module_function 的目的正是您在问题中提到的:它使您可以灵活地在模块上显式调用类方法,使用模块名称,或将其混合并制作事情更简洁一些。

您也可以使用 extend self(在模块定义内)做同样的事情。不同之处在于,如果你混入一个使用 module_function 的模块,混入的方法将成为 private 实例方法(但它们将是声明模块的公共(public)类方法);如果您使用 extend self,它们将具有模块定义中使用的任何访问限定符,两者在混入时以及在模块上作为类方法直接调用时。

关于ruby - 使用 Module#module_function 被认为是不好的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9266308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com