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 に答える