3

配列に単純な各ステートメントがあります

game.each{|match|  winner += rps_game_winner(match) 

勝者は以前は次のように定義されていますwinner = []

rps_game_winnerは、2つの要素の配列を返します。勝者は2つの要素の配列の配列になりたいです。代わりに、ゲームに2つの一致がある場合、4つの要素の配列を取得します。

4つの要素の配列を2つの要素の2つの配列を持つ配列にすばやく変換する方法はありますか?または、最初に勝者を2つの要素の配列にする

たとえば、勝者は["rob"、 "Hi"、 "sally"、 "no"]ではなく[["rob"、 "Hi"]、["sally"、"no"]]と等しくする必要があります。

4

3 に答える 3

3

使用しないでください+=; 使用<<

game.each{|match| winner << rps_game_winner(match)}

+2つの配列を1つに結合しながら、<<新しい要素を追加します。新しい要素自体が別の配列である場合でも、にマージされるのではなく、要素として追加されます。

句読点よりも単語を好む場合は、スペルを入力することもできますpush

game.each do |match| winner.push(rps_game_winner match) end
于 2012-10-14T23:11:44.807 に答える
2

を使用しますeach_cons。これは、連続する各要素を意味します。

game.each_cons(2){|match1,match2| 
    winner << [rps_game_winner(match1), rps_game_winner(match2)]
}

*注意:rps_game_winnerが2つの要素を持つ配列ではなく、フラットな要素を返す場合、each_consの使用は正常に機能します

于 2012-10-14T23:12:16.840 に答える
1

あなたが欲しい#each_slice。これにより、反復可能な列挙可能なメソッドが返されますが、それを呼び出すと#to_a、必要な配列に変換されます。

["rob","Hi","sally","no"].each_slice(2).to_a # => [["rob", "Hi"], ["sally", "no"]]
于 2012-10-15T02:49:42.217 に答える