小编典典

我可以在不包含 Ruby 模块的情况下调用实例方法吗?

all

背景:

我有一个模块,它声明了许多实例方法

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

我可以看到几个可能的解决方案:

  1. 以某种方式直接在模块上调用该方法,而不在任何地方包含它
    • 我不知道如何/是否可以做到这一点。(因此这个问题)
  2. 不知何故包括Usefulthings并且只引入它的一些方法
    • 我也不知道如何/是否可以做到
  3. 创建一个代理类,包含UsefulThings在其中,然后委托format_text给该代理实例
    • 这会起作用,但匿名代理类是一种黑客攻击。呸。
  4. 将模块拆分为 2 个或更多更小的模块
    • 这也可行,并且可能是我能想到的最好的解决方案,但我宁愿避免它,因为我最终会得到几十个模块的扩散——管理这将是繁重的

为什么单个模块中有很多不相关的功能?它ApplicationHelper来自一个 Rails
应用程序,我们的团队实际上已决定将其作为任何不具体到不属于其他任何地方的东西的垃圾场。主要是随处使用的独立实用程序方法。我可以把它分解成单独的助手,但是会有
30 个,每个都有 1 种方法......这似乎没有生产力


阅读 78

收藏
2022-06-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

2022-06-30