我正在尝试做这样的事情:
module RefinedHash
refine Hash do
def initialize(*args)
super
# something here
end
def [](key)
'whatever'
end
end
end
class Hello
using RefinedHash
def initialize
h = Hash.new
p h[:test]
end
end
Hello.new # => "whatever"
因此,[]
可以很好地工作,并返回'whatever'
以便进行任何键的调用(仅出于测试目的,即知道我们的优化已得到有效应用)。但是,可惜的是,当我使用initialize
实例化Hash时,完全不会执行经过改进的Hash.new
方法中的任何代码。我是否缺少某些内容?还是说某个地方initialize
不能像其他任何方法一样完善?
答案 0 :(得分:4)
我不确定initialize
为什么不起作用。可能是因为Class#allocate
以某种绕过细化机制的方式调用了它吗?但是您可以优化new
,以获得相同的效果:
module RefinedHash
refine Hash.singleton_class do
def new(*args)
obj = super
# something here
obj
end
end
end