如何拦截对Hash类构造函数的调用?

时间:2011-03-18 19:16:30

标签: ruby metaprogramming

我想在调用类Hash的构造函数或初始化Hash对象时执行函数。我已经使用

实现了我的目标
class Hash
  def initialize
    p "Constructor call"
  end
end

上面的代码在Hash对象初始化时工作正常,如下所示:

a = Hash.new(:a1 => "Hi")

但是,当我使用以下代码时:

a = {:a1 => "Hi"}

然后,它失败或者没有调用构造函数。那么,如何拦截第二个代码片段中的调用?

提前致谢。

2 个答案:

答案 0 :(得分:2)

我担心你不能进行核磁共振检查,但可能会在Rubinius / JRuby中管理一些东西。

答案 1 :(得分:2)

不幸的是,就像几乎所有其他语言一样,你不能在Ruby中覆盖文字。您必须使用支持此功能的少数几种语言之一,例如Ioke

cell(:{}) = method(+x, "Literal {} called with #{x inspect}" println)

{ :a1 => "Hi" }
;; Literal {} called with [:a1 => "Hi"]

(事实上,Ioke是我现在能想到的唯一的语言,允许文字重载/覆盖。我想Ioke的堂兄Seph会支持它,并且几年之前有一些关于在Newspeak中允许它的讨论,但那是关于它的。)