ruby – 如何检测递归数组和散列?

如何检测包含下面的a,b和c等递归结构的数组或散列?

>最简单的递归数组实例

a = []
a[0] = a
a # => [[...]]

>递归周期/深度不是一个

b = [[],:foo]
b[0][0] = b
b # => [[[...]],:foo]

>非根级别的递归

c = [a,:foo]
c # => [[...],:foo]

解决方法

我喜欢递归.

这是一个不错的方式,迭代所有内容并保持您看到的对象的哈希值(用于快速查找)

class Object
  def is_recursive?(kNown = {})
    false
  end
end

module Enumerable
  def is_recursive?(kNown = {})
    return true if kNown.include?(self)
    kNown[self] = true
    begin
      any? do |*args|
        args.any?{|item| item.is_recursive?(kNown)}
      end
    ensure
      kNown[self] = false
    end
  end
end

x = []; x << x
p x.is_recursive? # => true
p ({x => 42}).is_recursive? # => true
p [{foo: x}].is_recursive? # => true
p [[[[[[:foo],{bar: [42]}]]]]].is_recursive? # => false

请注意,这有点粗糙,你可能遇到麻烦.例如,你有[1..Float :: INFINITY] .is_recursive?的无限循环,虽然这很容易用

class Range
  def is_recursive?(kNown = {})
    false # optimization
  end
end

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...