1

这只是一个思考练习,我会对任何意见感兴趣。虽然如果它有效,我可以想出几种我会使用它的方法。

传统上,如果您想对由数组或范围等形成的嵌套循环的结果执行函数,您会编写如下内容:

def foo(x, y)
  # Processing with x, y
end

iterable_one.each do |x|
  iterable_two.each do |y|
      my_func(x, y)
  end
end

但是,如果我必须添加另一层嵌套怎么办。是的,我可以添加一个额外的循环级别。此时,让我们让 foo 接受可变数量的参数。

def foo(*inputs)
  # Processing with variable inputs
end

iterable_one.each do |x|
  iterable_two.each do |y|
    iterable_three.each do |z|
      my_func(x, y, x)
    end
  end
end

现在,假设我需要添加另一层嵌套。在这一点上,它变得非常粗糙。

因此,我的问题是:是否可以编写如下内容?

[iterable_one, iterable_two, iterable_three].nested_each(my_func)

也许

[iterable_one, iterable_two, iterable_three].nested_each { |args| my_func(args) }

也许将参数作为实际参数传递是不可行的,您是否可以将一个数组传递给 my_func,其中包含来自可枚举组合的参数?

我很想知道这是否可能,这可能不太可能发生,但在我发生这种情况后我想知道。

4

2 回答 2

4

Array.product 产生枚举的组合,就好像它们在嵌套循环中一样。它需要多个参数。演示:

a = [1,2,3]
b = %w(a b c)
c = [true, false]

all_enums = [a,b,c]
all_enums.shift.product(*all_enums) do |combi|
  p combi
end


#[1, "a", true]
#[1, "a", false]
#[1, "b", true]
#...
于 2013-02-27T19:28:53.733 回答
3

您可以使用product

[1,4].product([5,6],[3,5])  #=> [[1, 5, 3], [1, 5, 5], [1, 6, 3], [1, 6, 5], [4, 5, 3], [4, 5, 5], [4, 6, 3], [4, 6, 5]]
于 2013-02-27T19:30:10.470 回答