模块类可访问的私有模块方法

时间:2017-11-07 03:10:19

标签: ruby oop rubygems

我试图用Ruby gem包装命令行实用程序的功能(让我们称之为<?php function subscribe_request($phone) { <script src="js/subscrie.js" type="text/javascript"> //something </script> } ?> )。我试图将一些功能抽象到不同的类中,但我希望有一个逻辑处理在一个方法中调用系统,以便我可以处理来自应用程序的错误单身。

我可以通过在gem

的主模块中定义一个方法来轻松完成此操作
foo

然后每个类都可以通过这种方法将调用传递给可执行文件

module Foo
  def self.execute(*args)
    exec('foo', *args)
    # Pretend there is a lot more error handling etc. here
  end
end

理想情况下,我希望module Foo class Bar # Access via class method def self.list_bars Foo.execute('ls', 'bars') end # Access via instance method def initialize # Make a call to the system executable via the class method Foo.execute('initialize', 'bar') end def config(*args) Foo.execute('config', 'bar', *args) end end end 方法私有,以便我模块的公共API完全是Foo.execute的抽象。如果我将foo标记为Foo.execute,那么模块中的其他类(显然)无法访问它。

如何用Ruby 2.3简洁地完成这项工作?

值得注意的是,我实际上只是使用模块private进行命名空间。

1 个答案:

答案 0 :(得分:1)

ruby​​中的模块只是方法和常量的容器。类对它们构成的模块一无所知,也不从它们继承。所以没有办法让'Foo'上的方法可用于其中的所有类。

这种方法可能会给你你想要的东西。

module Foo
  module CommandRunning
    def execute(*args)
      # ...
    end
  end

  class Bar
    include CommandRunning

    def initialize
      execute('initialize', 'bar')
    end
  end
end