如何简化此枚举器代码?

Ale*_*lex 6 ruby optimization enumerator simplification

我想优化以下代码以简洁.

x1.each { |x| 
  x2.each { |y|
    ....
    xN.each { |z|
      yield {}.merge(x).merge(y)...... merge(z)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

假设x1, x2, ..., xNEnumerator对象.

  1. 以上并不简洁
  2. 它适用于x1,x2作为Arrays,但不能作为Enumerators
    • 因为枚举器迭代器应该重置为内部循环

我试过这个但没有成功:

[x1, x2, ..., xN].reduce(:product).map { |x| x.reduce :merge }
Run Code Online (Sandbox Code Playgroud)

有什么建议?

UPDATE

目前解决了:

[x1, x2, ..., xN].map(:to_a).reduce(:product).map { |x| 
  yield x.flatten.reduce(:merge) 
}
Run Code Online (Sandbox Code Playgroud)

Uri*_*ssi 5

我将从第2点开始:

  • 至少Enumerators我已经测试过([{a: 1}, {a: 2}, {a: 3}].each)你的代码工作了 - 显然Enumerator#each要么在最后回卷,要么使用自己的指针.
  • 要做你想做的事情,你需要在Enumerator对象(特别是内部对象)上进行多次迭代to_a,首先调用每个对象不会增加你的时间复杂度(它将保持不变)O(n1*n2*...*nk)

对于#1点,如果调用to_a是不可能的,您可以考虑递归:

def deep_merge(enum = nil, *enums)
  if enum.nil?
    yield({})
  else
    enum.each do |x|
      deep_merge(*enums) do |h|
        yield h.merge(x)
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

现在你可以致电deep_merge(x1, x2, ... xN)并获得所需的结果......