我有一个哈希。这些键之一是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
}
但未跟踪:[]=
。我删除了猴子补丁。我无法获得:[]=
的用法出现在此输出中。
有什么办法可以窥探散列的变化,以便我可以跟踪该键的值在哪里更改?
答案 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
编辑:这种方法已经过时,但仅供参考。