有什么办法可以在Ruby中完善某个类的initialize方法吗?

时间:2019-01-10 19:01:30

标签: 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]
  end
end

Hello.new # => "whatever"

因此,[]可以很好地工作,并返回'whatever'以便进行任何键的调用(仅出于测试目的,即知道我们的优化已得到有效应用)。但是,可惜的是,当我使用initialize实例化Hash时,完全不会执行经过改进的Hash.new方法中的任何代码。我是否缺少某些内容?还是说某个地方initialize不能像其他任何方法一样完善?

1 个答案:

答案 0 :(得分:4)

我不确定initialize为什么不起作用。可能是因为Class#allocate以某种绕过细化机制的方式调用了它吗?但是您可以优化new,以获得相同的效果:

module RefinedHash
  refine Hash.singleton_class do
    def new(*args)
      obj = super
      # something here
      obj
    end
  end
end