[英]How can I spy on the `[]=` method in Ruby hash?
我有一个哈希。 这些键之一是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)
只会在(原始) Hash#[]=
不可用时使您的HashPatches#[]=
被调用,事实并非如此。 此外, super
你HashPatches#[]=
定义将自超不工作Object
您的HashPatches
没有[]=
。
为了让您的HashPatches#[]=
优先于原始Hash#[]=
,您需要执行以下操作:
Hash.prepend(HashPatches)
您可以对Hash
类本身进行猴子修补。 把它放在模块/类定义中,
class Hash
def []=(arg)
# do your magic here with a debugger or pry
end
end
编辑:这种方式已经过时,但留作参考。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.