编写Ruby库-从模块外部隐藏方法
我正在写一个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
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:你说得对。我犯了一个愚蠢的错误。我已经写了另一个变通方法,它不是这种愚蠢错误的受害者,但仍然解决了问题。