我有一份杂烩。其中一个键是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
}

但没有追踪到。我把猴子的补丁去掉了。我无法让:[]=的用法出现在此输出中。
有什么方法可以监视散列的更改,以便我可以跟踪此键的值在哪里更改?

最佳答案

Hash.send(:include, HashPatches)只在(原始的)HashPatches#[]=不可用时调用您的Hash#[]=,而不是这样。此外,super定义中的HashPatches#[]=也将不起作用,因为Object的超类没有HashPatches
要使您的[]=优先于原始的HashPatches#[]=,您需要:

Hash.prepend(HashPatches)

08-04 15:50