我有一个散列。其中一个密钥是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
}
但未追踪到CCD_ 7。我去掉了猴子的补丁。我无法将:[]=
的用法显示在此输出中。
有没有什么方法可以监视哈希的更改,这样我就可以追踪这个键的值在哪里更改了?
Hash.send(:include, HashPatches)
只会在(原始(Hash#[]=
不可用时调用您的HashPatches#[]=
,但事实并非如此。此外,HashPatches#[]=
定义中的super
将不起作用,因为HashPatches
的超类Object
没有[]=
。
要使您的HashPatches#[]=
优先于原始Hash#[]=
,您需要执行以下操作:
Hash.prepend(HashPatches)
您可以对Hash
类本身进行猴子补丁。将其放入模块/类定义中
class Hash
def []=(arg)
# do your magic here with a debugger or pry
end
end
编辑:这种方式已经过时,但仅供参考。