2014-01-30 31 views
6

他们似乎也是这么做的。为什么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"}]] 

为什么有这两种方法?

+10

他们在*这些特定输入*上做同样的事情。 –

+12

根据@ColonelPanic的说法,当你只看一个微不足道的例子时,你不能得出它们是相同的结论。这有点像问为什么Ruby有'*'和'+',因为'2 + 2'和'2 * 2'做同样的事情。 – lurker

+1

@mbratch谢谢你让我感到很蠢。说得好! :D –

回答

11

#transpose假定自己是数组并转置行和列。

#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,不需要ba大小相同,即ba可以是任何大小。

随着#zip,结果数组大小将永远的大小self。随着#transpose由此产生的阵列大小将是任何内部阵列的大小self

相关问题