ruby - 如何监视 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
}
但:[]=
没有被追踪。我已经删除了猴子补丁。我无法:[]=
在此输出中出现 of 的用法。
有什么方法可以监视对哈希的更改,以便我可以追踪该键的值在哪里更改?
解决方案
Hash.send(:include, HashPatches)
仅在(原始)不可用HashPatches#[]=
时才调用您,但事实并非如此。Hash#[]=
此外,super
在您的HashPatches#[]=
定义中将不起作用,因为Object
您的超类HashPatches
没有[]=
.
要优先于您HashPatches#[]=
的原始Hash#[]=
,您需要执行以下操作:
Hash.prepend(HashPatches)
推荐阅读
- c# - 将字节数组从数据库转换为视频文件
- python - 删除 pandas groupby 中的空或 nan 组
- python - 如何在子列表中的字符串之间找到完全匹配
- python - 高效地逐行读取Excel文件
- javascript - 当ajax oncomplete时,jquery不起作用,Primefaces
- java - 是否可以将 Hibernate 的自定义映射器从 NUMBER 数据库类型添加到 Java Integer?
- python - 通过使用每列的缩放数据来减少 pandas DataFrame 内存消耗?
- java - 解析导致的错误:org.thymeleaf.exceptions.TemplateInputException 模板解析过程中发生错误 [templates/.html]"
- android - 迁移到 AndroidX 后找不到 SnackbarContentLayout 类
- c# - 如何在c#中将字典序列化为yaml文件