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