gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:31:15 26 4
gpt4 key购买 nike

我正在编写一个 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 甚至不包括 Helper 类的 .new 方法。有什么想法吗?

感谢阅读!

最佳答案

正如@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,没有什么可以阻止他们,但这只是您必须要做的事情用动态语言处理。

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

关于ruby - 编写 Ruby 库 - 从模块外部隐藏方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2898272/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com