如何监视Ruby哈希中的[[] =`方法?

时间:2018-10-31 13:10:42

标签: ruby hash

我有一个哈希。这些键之一是daily_budget。经过一些处理后,daily_budget已更改,而其他所有键的值均未更改。要么更改了该键的哈希值,要么我正在克隆哈希并在克隆的哈希上设置该值。

我想窥探Hash#[]=方法,以查明发生这种情况的位置。我会用猴子修补它,注意一个名为daily_budget的密钥,并在设置它时转储堆栈跟踪。

我试图使用这样的代码:

module HashPatches
  def []=(key, value)
    puts ">>>> hey! I got here!"
    super(key, value)
  end
end

Hash.send(:include, HashPatches)

Hash上的其他补丁程序正在工作的情况下,似乎忽略了此更改。我做错什么了吗?

我还尝试使用set_trace_func使用此代码来跟踪对哈希的调用,

set_trace_func proc { |event, file, line, id, binding, classname|
  if file =~ /\/my_project_name\//
    puts ">>>> #{id}"
    puts ">>>> #{classname}"
    puts ">>>> #{event}"
    puts ">>>> #{file}"
    puts ">>>> #{line}"
  end
}

但未跟踪:[]=。我删除了猴子补丁。我无法获得:[]=的用法出现在此输出中。

有什么办法可以窥探散列的变化,以便我可以跟踪该键的值在哪里更改?

2 个答案:

答案 0 :(得分:2)

Hash.send(:include, HashPatches)仅使HashPatches#[]=(原始)Hash#[]=不可用时才被调用,事实并非如此。另外,由于您的super的超类HashPatches#[]=没有Object,因此HashPatches定义中的[]=将不起作用。

要使您的HashPatches#[]=优先于原始Hash#[]=,您需要执行以下操作:

Hash.prepend(HashPatches)

答案 1 :(得分:0)

您可以通过猴子自己来修补Hash类本身。将其放在模块/类定义中,

class Hash
  def []=(arg)
    # do your magic here with a debugger or pry
  end 
end

编辑:这种方法已经过时,但仅供参考。