2012-04-09 7 views
2

Я пытаюсь написать отладчик в рубине. Я хочу запускать некоторый код каждый раз, когда изменяется переменная. Я не знаю переменные заранее.Как обнаружить переменные изменения/присвоения в ruby ​​

На данный момент я пытаюсь set_trace_func, но, похоже, выполняется перед каждой строкой, а не после каждой строки, например;

set_trace_func proc { |event, file, line, id, binding, classname| 
    if file == "(eval)" 
     printf "%8s %s:%-2d %10s %8s\n", event, file, line, id, classname 
     args = binding.eval("local_variables").inject({}) do |vars, name| 
      value = binding.eval name.to_s 
      vars[name] = value unless vars.nil? 

      vars 
     end 
     puts args.inspect 
    end 
} 

eval("blah = 4\nrar = 3\n") 

set_trace_func(nil) 

Когда я его выполню, я получаю;

[email protected]:~$ ruby blah.rb 
    line (eval):1      
{:blah=>nil, :rar=>nil} 
    line (eval):2      
{:blah=>4, :rar=>nil} 
[email protected]:~$ 

Это не то, что я хочу - это не показывает назначение для rar. Есть лучший способ сделать это? В качестве взлома я добавил последнее утверждение к eval, например.

eval("blah = 4\nrar = 3\nnil\n") 

но это не решает проблему, когда дело доходит до петли и т.д.

Я хотел бы получить выход какой линии переменной изменилось, и что изменилось в порядке.

ответ

1

Я не знаю механизма в чистом рубине, чтобы помочь вам написать отладчик и подключить функции выполнения низкого уровня, такие как назначение переменных. Ruby-debug - это расширение C с глубокими знаниями и перехватывает механизм выполнения. Вы можете read it here.

+0

Благодарим за отзыв. Мои знания немного устарели, и у меня много проблем с получением чего-то полезного. – Anko

Смежные вопросы