如何拆分数组?

Ray*_*kie 5 ruby arrays

给定一个数组:

arr = [['a', '1'], ['b','2'], ['c', '3']] 
Run Code Online (Sandbox Code Playgroud)

什么是将它分成两个数组的最佳方法?

例如,从上面的数组我想得到以下两个数组:

first = ['a','b','c']  
second = ['1', '2', '3'] 
Run Code Online (Sandbox Code Playgroud)

我能用这个collect吗?

Ray*_*kie 15

好吧,我偶然发现了 arr.transpose

arr = [['a', '1'], ['b','2'], ['c', '3']].transpose 

first = arr[0] 

second = arr[1] 
Run Code Online (Sandbox Code Playgroud)

相比上述问题的答案arr.zip,arr.map以及foreach,这是更有效的?或者哪个是最优雅的解决方案?

或者(感谢JörgWMittag的评论 - 见下面的评论)first,second = arr.transpose

  • 你可以使用destructuring bind:`first,second = arr.transpose`.更优雅.而且由于我们在这里打击性能:JRuby团队正致力于积极优化编译器,当使用解构绑定,多个赋值,多个返回值,splat参数等时,可以消除中间数组.(事实上​​,编译器非常好,它的作者要求他们在Ruby中重写JRuby的一些Java部分,因为它实际上会更快.) (11认同)
  • 这基本上是转置的全部要点,因此几乎可以保证最有效率.其他部件的运动部件稍微多一些,这通常会导致效率降低.我怀疑差异通常是那么大.然而,转置方法肯定是最具可读性的,所以这将是我书中最大的优点.(我总是不愿意说一个方法*是最有效的,期间*,因为不同版本的Ruby中的性能怪癖通常会在某天成为我的骗子.) (2认同)