[英]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.