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

时间:2014-01-30 11:32:31

标签: ruby arrays zip transpose

他们似乎做了同样的事情。

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"}]]

为什么有这两种方法?

1 个答案:

答案 0 :(得分:12)

#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应该具有相同的大小。但是,对于应用#zipb不需要与a相同,即ba可以是任意大小。

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