背景:

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

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种方法中的all种.在这种情况下,我只想要format_text,明确地说,我不想要get_filedelete_file.

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

  1. 以某种方式直接在模块上调用该方法,而不将其包含在任何地方
  2. 以某种方式包括Usefulthings个,并且只引入其中一些方法
  3. 创建一个代理类,其中包含UsefulThings,然后将format_text委托给该代理实例
  4. 将模块拆分为两个或更多更小的模块

为什么一个模块中有很多不相关的功能?这是rails应用程序的ApplicationHelper分,我们的团队实际上已经决定将其作为任何不太具体的东西的倾倒场,不属于其他任何地方.大多数是独立的实用方法,在任何地方都可以使用.我可以把它分解成不同的助手,但会有30个,每个都有一种方法...这似乎是徒劳的

推荐答案

如果一个模块上的一个方法变成了一个模块函数,你可以简单地从Mods中调用它,就好像它被声明为

module Mods
  def self.foo
     puts "Mods.foo(self)"
  end
end

下面的模块功能方法将避免 destruct 包含所有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  

然而,我很好奇为什么一组不相关的函数首先都包含在同一个模块中?

Edited表示如果在module_function :foo之后调用public :foo,则仍包括工作

Ruby相关问答推荐

Ruby脚本递归地创建深度嵌套的目录

鲁比.METHOD_MISSING+SEND对于带有命名参数的混合参数失败

警告 Selenium [弃用] Manager#logs 已弃用.使用 Chrome::Driver#logs 代替

使用 Sorbet RBI 时需要 Elem

如何用 yield_self 断链

Ruby符号前面的-是什么意思?

Rails 3 - 限制资源路径中的操作格式

构造Ruby的现代方法是什么?

如何在不将换行符粘贴到字符串中的情况下使用puts添加额外的换行符?

为什么 Range 在下降时不起作用?

判断文件是否包含字符串

Ruby 是否有任何数字格式化类?

Ruby:继承与类变量一起工作的代码

我可以在 Ruby 2.x 中要求命名参数吗?

如何删除字符串中的重复空格?

将 Ruby 哈希转换为 YAML

如何在 Ruby 中创建私有类常量

为什么 Ruby 的 Date 类会自动加载,但 DateTime 不会?

以小时为单位的时差

判断文件名是文件夹还是文件