我有一些可以简化为以下的代码。它适用于 Ruby 2.3.3 并在 2.3.4 上中断。这有点奇怪,我欢迎关于如何重写它的建议以及关于它为什么会中断的解释。
require 'forwardable'
class Dummy
class << self
TEST = {
a: Dummy.new,
b: Dummy.new
}
extend Forwardable
def_delegators :TEST, :[]
private :new
end
end
puts Dummy[:a]
红宝石 2.3.3
#<Dummy:0x007fbd6d162380>
红宝石 2.3.4
NameError: uninitialized constant TEST
目标是只初始化TEST
一次并且.new
是私有的。在方法中记忆@test
变量[]
不起作用,因为new
在创建哈希时是私有的。
编辑
从等式中删除 Forwardable 可以解决问题,但我仍然很好奇为什么以及如何改进它的想法。
class Dummy
class << self
TEST = {
a: Dummy.new,
b: Dummy.new
}
def [](key)
TEST[key]
end
private :new
end
end
puts Dummy[:a]
红宝石 2.3.3 和 2.3.4
#<Dummy:0x007fbd6d162380>