首页 > 解决方案 > 如何监视 Ruby 哈希中的 `[]=` 方法?

问题描述

我有一个哈希。这些键之一是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
}

:[]=没有被追踪。我已经删除了猴子补丁。我无法:[]=在此输出中出现 of 的用法。

有什么方法可以监视对哈希的更改,以便我可以追踪该键的值在哪里更改?

标签: rubyhash

解决方案


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

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

Hash.prepend(HashPatches)

推荐阅读