我可以在不包含它的情况下调用Ruby模块上的实例方法吗?
背景:
我有一个模块,它声明了许多实例方法
module UsefulThings
def get_file; ...
def delete_file; ...
def format_text(x); ...
end
我想从一个班级中调用其中的一些方法。 你通常如何在ruby中这样做是这样的:
class UsefulWorker
include UsefulThings
def do_work
format_text("abc")
...
end
end
问题
include UsefulThings
带来所有从方法UsefulThings
。 在这种情况下,我只需要format_text
并且不需要get_file
和delete_file
。
我可以看到几种可能的解决方案:
Usefulthings
,只引入它的一些方法 UsefulThings
,然后将format_text
委托给该代理实例 为什么单个模块中有很多不相关的功能? 它是来自Rails应用程序的ApplicationHelper
,我们的团队已事实上决定将它作为任何不属于任何其他地方的具体内容的倾销地。 大多数独立的实用程序方法在任何地方都可以使用。 我可以把它分解成单独的助手,但是会有30个,每个都有1个方法......这看起来没有什么效果
如果模块上的某个方法变成了模块函数,那么您可以简单地将它称为Mods,就好像它已被声明为一样
module Mods
def self.foo
puts "Mods.foo(self)"
end
end
下面的module_function方法将避免打破任何包含所有Mod的类。
module Mods
def foo
puts "Mods.foo"
end
end
class Includer
include Mods
end
Includer.new.foo
Mods.module_eval do
module_function(:foo)
public :foo
end
Includer.new.foo # this would break without public :foo above
class Thing
def bar
Mods.foo
end
end
Thing.new.bar
但是,我很好奇为什么一组无关的函数都被包含在同一个模块中?
编辑以显示包含仍然工作,如果public :foo
在module_function :foo
之后module_function :foo
我认为最简单的方法就是抛弃单个调用(不改变现有模块或创建新模块),如下所示:
Class.new.extend(UsefulThings).get_file
如果你“拥有”模块的另一种方法是使用module_function
。
module UsefulThings
def a
puts "aaay"
end
module_function :a
def b
puts "beee"
end
end
def test
UsefulThings.a
UsefulThings.b # Fails! Not a module method
end
test
链接地址: http://www.djcxy.com/p/44833.html
上一篇: Can I invoke an instance method on a Ruby module without including it?
下一篇: Is it possible to exclude specific commits when doing a git merge?