ruby调试,试图遍历对象实例变量

时间:2011-02-21 21:46:48

标签: ruby

我很好奇是否可以遍历对象的实例变量并转储一些基本的调试信息。

我知道你可以通过执行object.instance_variables获取实例变量列表,它返回一个符号化变量数组,如[:@var1, :@var2, :@etc]我首先想到的是如何做到这一点:

obj.instance_variables.each do
  obj.instance_variable_get(var).to_yaml
end

但是我收到以下错误:“无法转储匿名类类”。什么是更好的方法?

2 个答案:

答案 0 :(得分:5)

问题是你的实例变量中有一些匿名的proc或函数没有响应to_yaml。因为它无法转换为yaml,所以您收到此错误。尝试使用inspect,所有对象都应该响应inspect:

obj.instance_variables.each do |var|
  p obj.instance_variable_get(var).inspect
end

答案 1 :(得分:0)

你必须考虑到在ruby中只是声明a​​ttr_accessor不会创建变量,你需要分配它:

class A
  attr_accessor :x, :y

  def initialize(z)
    @x=z
  end

end

def inspect_object(o)
    o.instance_variables.each do |var|
        var.slice!(0)
        p var
        p o.send(var)
    end

end

a = A.new(5)
inspect_object(a)

此输出

"x"
5