它们似乎做了相同的事情。
g = [{ a: "A" }, { b: "B" }]
r = [{ x: "X" }, { y: "Y" }]
g.zip(r) # => [[{:a=>"A"}, {:x=>"X"}], [{:b=>"B"}, {:y=>"Y"}]]
[g,r].transpose # => [[{:a=>"A"}, {:x=>"X"}], [{:b=>"B"}, {:y=>"Y"}]]
为什么需要两种方法?
#transpose
方法假设self是一个由数组组成的数组,并转置行和列。
#zip
方法假设self
可以是任何Enumerable
对象。
更多差异在此处。
a = [12,11,21]
b = [1,2]
[a,b].transpose # transpose': element size differs (2 should be 3) (IndexError)
a.zip(b) # => [[12, 1], [11, 2], [21, nil]]
b.zip(a) # => [[1, 12], [2, 11]]
应用#transpose
方法需要保证a
和b
的大小相同。但是对于应用#zip
, b
的大小与a
相同并不是必须的,也就是说,b
和a
可以是任何大小。
使用#zip
时,结果数组的大小将始终为self
的大小。而使用#transpose
时,结果数组的大小将是self
的内部数组中的任意一个大小。
*
又有+
,因为2+2
和2*2
做的是同样的事情。 - lurker