如何监视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
}

但未追踪到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

编辑:这种方式已经过时,但仅供参考。

相关内容

最新更新