如何在ruby中检测变量更改/分配

如何在ruby中检测变量更改/分配,ruby,Ruby,我正在尝试用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, cl

我正在尝试用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)
当我执行它时,我得到

n@VirtualBox:~$ ruby blah.rb 
    line (eval):1                     
{:blah=>nil, :rar=>nil}
    line (eval):2                     
{:blah=>4, :rar=>nil}
n@VirtualBox:~$
这不是我想要的-它没有显示分配给rar的任务。有更好的方法吗?作为黑客,我在评估中添加了最后一句话

eval("blah = 4\nrar = 3\nnil\n")
但这并不能解决循环等问题


我想得到一个变量在哪一行上更改的输出,以及它按顺序更改为哪一行。

我不知道纯ruby中有什么机制可以帮助您编写调试器和挂钩低级执行功能,如变量赋值。ruby debug是一个具有深入知识的C扩展,并与执行引擎挂钩。您可以。

谢谢您的回复。我的c语言知识有点过时了,我很难从中得到有用的东西。