编写 Ruby 库 - 从模块外部隐藏方法

JP.*_*JP. 5 ruby module class

我正在编写一个 Ruby 库,它有一个模块,里面有一堆类。其中许多类需要通过调用脚本来使用和修改,但我不希望(某些)初始化程序可见/可调用:

module MyLib
  class Control
    def initialize
      # They can use this
    end

    def do_stuff
      Helper.new('things')
    end
  end

  class Helper
    # Shouldn't be visible 
    def initialize(what)
      @what = what
    end

    def shout
      @what
    end
  end
end

c = MyLib::Control.new
h = c.do_stuff
p h.shout
# => "things"
# ^ All of this is desired

# v This is undesirable
p MyLib::Helper.new('!')
# => <MyLib::Helper @what='!'>
Run Code Online (Sandbox Code Playgroud)

如果这是一件简单的事情,那么我也希望生成的 RDoc 甚至不包含该类的.new方法Helper。有任何想法吗?

谢谢阅读!

Mar*_*off 3

正如@Matthew 指出的那样,我原来的答案是完全错误的。但还有其他解决方法。例如,您可以将匿名类分配给 上的类变量Control,并且仍然可以使用以下命令正常定义方法class_eval

module MyLib
  class Control
    def initialize
    end

    def do_stuff
      @@helper.new('things')
    end

    @@helper = Class.new
    @@helper.class_eval do
      def initialize(what)
        @what = what
      end

      def shout
        @what
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

片段

c = MyLib::Control.new
h = c.do_stuff
p h.shout
Run Code Online (Sandbox Code Playgroud)

仍然写入,但现在除了通过类变量之外"things"无法访问。@@helper如果有人真的想通过重新打开Control课程或使用来访问它class_eval,没有什么可以阻止他们,但这只是你必须用动态语言处理的事情。

我选择将匿名类分配给一个类变量,这样它只会被创建一次;但是如果您不关心多次重新定义匿名类,那么它就没有理由不能成为实例变量。