在Ruby中使用2个数组是否有惯用的方法?

B S*_*ven 5 ruby iterator enumerable ruby-1.9.3

a = [3, 4, 7, 8, 3]
b = [5, 3, 6, 8, 3]
Run Code Online (Sandbox Code Playgroud)

假设相同长度的数组,有没有办法使用each或其他一些惯用的方法从两个数组的每个元素得到一个结果?没有使用柜台?

例如,要获取每个元素的产品: [15, 12, 42, 64, 9]

(0..a.count - 1).each do |i| 太丑了......

Ruby 1.9.3

D.S*_*ley 6

怎么样使用Array.zip:

>> a = [3,4,7,8,3]
=> [3, 4, 7, 8, 3]
>> b = [5,3,6,8,3]
=> [5, 3, 6, 8, 3]
>> c = []
=> []
>> a.zip(b) do |i, j| c << i * j end
=> [[3, 5], [4, 3], [7, 6], [8, 8], [3, 3]]
>> c
=> [15, 12, 42, 64, 9]
Run Code Online (Sandbox Code Playgroud)

注意:我不是一个Ruby程序员,所以我为任何我已经践踏过的习语道歉.

  • 大括号通常与单行使用(`a.zip(b).each {| i,j | c << i*j}`),但这并不完全*践踏*.在这种特殊情况下,`map`会更合适:`c = a.zip(b).map {...}` (4认同)

saw*_*awa 4

出于性能原因,zip可能会更好,但transpose保持对称性并且更容易理解。

[a, b].transpose.map{|a, b| a * b}
# => [15, 12, 42, 64, 9]
Run Code Online (Sandbox Code Playgroud)

zip和之间的区别transpose在于,如果数组长度不同,前者将nil作为默认插入,而后者会引发错误。根据具体情况,您可能会偏爱其中一种。