有没有办法改进某些类';在Ruby中初始化方法?
我正在尝试这样做:有没有办法改进某些类';在Ruby中初始化方法?,ruby,Ruby,我正在尝试这样做: 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]
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'
(只是为了测试目的,知道我们的优化得到了有效应用)。但是,唉,当我用上面的Hash.new
实例化我的Hash时,精制initialize
方法中的任何代码都不会被执行。我是否遗漏了一些东西,或者在某个地方说明了initialize
无法像任何其他方法一样进行优化?我不确定initialize
为什么不起作用。这可能是因为Class#allocate
以某种绕过细化机制的方式调用它?但您可以优化新建,以获得相同的效果:
module RefinedHash
refine Hash.singleton_class do
def new(*args)
obj = super
# something here
obj
end
end
end
散列、数组、字符串和其他经常使用的对象有点特殊,因为它们在内部经过了大量优化,可以使用几个快捷方式。这可能包括散列。new
不调用新对象上的initialize
(甚至不隐式),而是以更快的方式“手动”构建对象。initialize
是私有的
,因此类#new
必须反射地调用它(即使用对象#uu发送u
/对象#发送
)和反射(当前)不尊重优化。这也是Holger写的。尤其是YARV经常以性能的名义破坏OO和封装。Rubinius和TruffleRuby做得更少,他们不需要这样做,因为他们的优化器更好。对!非常感谢,伙计们。我怀疑这样的事情,但不太确定如何克服这个限制我从来没有重新定义过new
,但不知怎么的,我没有想到。我想在Ruby文档中值得一提的是它的精化机制(至少我没有在那里找到它,或者在寻找线索时错过了它)。