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

saw*_*awa 6 ruby arrays recursion hash

如何检测,其中包括一个递归结构如数组或哈希a,bc下面?

Mar*_*une 5

我喜欢递归。

这是一个不错的方法,遍历所有内容并保留您看到的对象的散列(用于快速查找)

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
Run Code Online (Sandbox Code Playgroud)

请注意,这有点粗糙,您可能会遇到麻烦。例如,您将使用 无限循环[1..Float::INFINITY].is_recursive?,尽管这很容易挽救

class Range
  def is_recursive?(known = {})
    false # optimization
  end
end
Run Code Online (Sandbox Code Playgroud)