gpt4 book ai didi

ruby - 如何监视 Ruby 哈希中的 `[]=` 方法?

转载 作者:数据小太阳 更新时间:2023-10-29 08:56:43 25 4
gpt4 key购买 nike

我有一个散列。其中一个键是 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#[]= 不可用,事实并非如此。此外,HashPatches#[]= 定义中的 super 将不起作用,因为 HashPatches 的父类(super class) Object 可以没有 []=

要使您的 HashPatches#[]= 优先于原始 Hash#[]=,您需要执行以下操作:

Hash.prepend(HashPatches)

关于ruby - 如何监视 Ruby 哈希中的 `[]=` 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53084168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com