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)}

虽然+将两个数组合二为一,但<<会添加新元素。如果一个新元素本身恰好是另一个数组,它仍然作为一个元素添加,而不是合并。

如果你喜欢单词而不是标点符号,你也可以拼写它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 返回一个平面元素,而不是一个包含两个元素的数组,那么 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 回答