为什么Ruby在做同样的事情时会有拉链和转置?

他们似乎做同样的事情。

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方法ab应该具有相同的大小。 但是对于应用#zip ,不需要bb的大小相同,即ba可以是任何大小。

使用#zip ,结果数组大小将始终为self的大小。 使用#transpose ,生成的数组大小将是内部数组的self大小。