我正在编写一个 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='!'>
如果这是一件简单的事情,那么我也希望生成的 RDoc 甚至不包含该类的.new方法Helper。有任何想法吗?
谢谢阅读!
正如@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
片段
c = MyLib::Control.new
h = c.do_stuff
p h.shout
仍然写入,但现在除了通过类变量之外"things"无法访问。@@helper如果有人真的想通过重新打开Control课程或使用来访问它class_eval,没有什么可以阻止他们,但这只是你必须用动态语言处理的事情。
我选择将匿名类分配给一个类变量,这样它只会被创建一次;但是如果您不关心多次重新定义匿名类,那么它就没有理由不能成为实例变量。
| 归档时间: | 
 | 
| 查看次数: | 1729 次 | 
| 最近记录: |