有没有办法改进某些类';在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文档中值得一提的是它的精化机制(至少我没有在那里找到它,或者在寻找线索时错过了它)。