簡體   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