繁体   English   中英

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

[英]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#[]=被调用,事实并非如此。 此外, superHashPatches#[]=定义将自超不工作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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM