【发布时间】:2017-05-18 06:40:06
【问题描述】:
我有一些代码可以简化为以下内容。它适用于 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]
Ruby 2.3.3
#<Dummy:0x007fbd6d162380>
Ruby 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]
Ruby 2.3.3 和 2.3.4
#<Dummy:0x007fbd6d162380>
【问题讨论】:
-
顺便说一句,您不需要将常量放在
class << self块中。即使在外面也会被实例化一次。