我有一个模块,它声明了许多实例方法
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_fileand delete_file。
include UsefulThings
UsefulThings
format_text
get_file
delete_file
我可以看到几个可能的解决方案:
Usefulthings
为什么单个模块中有很多不相关的功能?它ApplicationHelper来自一个 Rails 应用程序,我们的团队实际上已决定将其作为任何不具体到不属于其他任何地方的东西的垃圾场。主要是随处使用的独立实用程序方法。我可以把它分解成单独的助手,但是会有 30 个,每个都有 1 种方法......这似乎没有生产力
ApplicationHelper
如果将模块上的方法转换为模块函数,您可以简单地从 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
public :foo
module_function :foo