我正在编写一个 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。有任何想法吗?
谢谢阅读!
正如@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,没有什么可以阻止他们,但这只是你必须用动态语言处理的事情。
我选择将匿名类分配给一个类变量,这样它只会被创建一次;但是如果您不关心多次重新定义匿名类,那么它就没有理由不能成为实例变量。