新手问题 Ruby 递归遍历实例遍历,有更好的办法么?

shiren1118 · 2013年01月28日 · 最后由 doitian 回复于 2013年01月28日 · 4935 次阅读

ruby 递归遍历实例遍历,有更好的办法么?

下面是我的土办法

@s=0
def recursion_dump_instance_variables(item)
  @s += 1;
  item.instance_variables.each do |v|
    p "#{@s}---"
    p  item.instance_variable_get(v)
    p "---"
    recursion_dump_instance_variables v
  end
end

各位有什么好办法?

方法 2

k= item.class
    ObjectSpace.each_object(k) {|x| 
      x.instance_variables.each do |y|
        p x.instance_variable_get(y)
      end
    }

ruby 递归遍历实例变量?

#1 楼 @keating 最近看一个库,里面把文本里内容解析到实例变量里,而且每个示例变量还是单独的 class。。。。。元编程是好用,不好读啊

@shiren1118 用方法二打印了一个 ActiveRecord 子类,立马崩溃了 😢

#3 楼 @keating 那是 ruby programming 2nd 里的啊

随便写的一个迭代实现未验证

q = [item]
while q != []
  item = q.shift
  yield item
  if item.try :instance_variables
    q += item.instance_variables
  end
end

引用成了个圈就爆了,要记录下已经打印过的 object_id

需要 登录 后方可回复, 如果你还没有账号请 注册新账号