Как я могу следить за методом `[] =` в хэше Ruby? - PullRequest
0 голосов
/ 31 октября 2018

У меня есть хэш. Один из этих ключей 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
}

но :[]= не отслеживается. Я удалил патч обезьяны. Мне не удалось отобразить значения :[]= в этом выводе.

Есть ли способ отслеживать изменения хэшей, чтобы я мог отследить, где изменяется значение этого ключа?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Hash.send(:include, HashPatches) делает ваш HashPatches#[]= вызываемым только тогда, когда (оригинал) Hash#[]= недоступен, что не соответствует действительности. Кроме того, super в вашем HashPatches#[]= определении не будет работать, поскольку суперкласс Object вашего HashPatches не имеет []=.

Чтобы отдать приоритет вашему HashPatches#[]= над исходным Hash#[]=, вам нужно сделать:

Hash.prepend(HashPatches)
0 голосов
/ 31 октября 2018

Вы можете обезопасить сам класс Hash. Поместите это в определение модуля / класса,

class Hash
  def []=(arg)
    # do your magic here with a debugger or pry
  end 
end

Редактировать: этот способ устарел, но оставлен для справки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...