我可以在不包含它的情况下调用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_filedelete_file

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

  • 以某种方式直接在模块上调用该方法,而不在任何地方包含该方法
  • 我不知道如何做到这一点。 (因此,这个问题)
  • 不知何故包括Usefulthings ,只引入它的一些方法
  • 我也不知道如何做到这一点
  • 创建一个代理类,在其中包含UsefulThings ,然后将format_text委托给该代理实例
  • 这会起作用,但匿名代理类是一种破解。 呸。
  • 将模块分成2个或更多更小的模块
  • 这也是可行的,也许是我能想到的最好的解决方案,但我更愿意避免它,因为我最终会遇到几十个和几十个模块的扩散 - 管理这将是负担繁重
  • 为什么单个模块中有很多不相关的功能? 它是来自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 :foomodule_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?