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

编写Ruby库-从模块外部隐藏方法,ruby,class,module,Ruby,Class,Module,我正在写一个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 visi

我正在写一个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='!'>
模块MyLib
类控制
def初始化
#他们可以用这个
结束
做什么
Helper.new('things'))
结束
结束
类助手
#不应该是可见的
def初始化(什么)
@什么
结束
def呼喊
@什么
结束
结束
结束
c=MyLib::Control.new
h=c.做些什么
呼喊
#=>“事情”
#^所有这些都是需要的
#这是不可取的
p MyLib::Helper.new(“!”)
# => 
如果这是一件简单的事情,那么我也希望生成的RDoc甚至不包括
助手
类的
.new
方法。有什么想法吗


谢谢你的阅读

Ruby有。

正如@Matthew所指出的,我最初的答案完全错了。但还有其他解决办法。例如,您可以将匿名类分配给
控件
上的类变量,并且仍然可以使用
class\u 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
片段

c = MyLib::Control.new
h = c.do_stuff
p h.shout
仍然写入
“things”
,但是现在除了通过class变量之外,没有办法访问
@@helper
。如果有人真的想通过我重新打开
控件
类或使用
类_eval
来访问它,没有什么可以阻止他们,但这只是在动态语言中必须处理的事情


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

如果将其定义为private,是否会阻止我从
控件
类调用
帮助程序。新建
?不幸的是,这被破坏了。它确实会引发语法错误,因为Helper现在处于控制状态。然而
p MyLib::Control::Helper.new(“!”)
现在可以工作了,尽管是私有的。@Matthew:你说得对。我犯了一个愚蠢的错误。我已经写了另一个变通方法,它不是这种愚蠢错误的受害者,但仍然解决了问题。