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, ..., xN是Enumerator对象.
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)
我将从第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)并获得所需的结果......
| 归档时间: |
|
| 查看次数: |
112 次 |
| 最近记录: |