2012-05-13 176 views
39

从检查Ruby 1.9.3的文档中,Array#< <和Array#push被设计用于实现将一个元素附加到当前数组的末尾。然而,两者之间似乎有微妙的差异。Ruby - Array#<<和Array#push之间的区别

我遇到的一个是*操作符可以用来将整个其他数组的内容追加到当前的数组中,但只能使用#push。

a = [1,2,3] 
b = [4,5,6] 

a.push *b 
=> [1,2,3,4,5,6] 

尝试使用#< <,而不是给各种错误,这取决于它的用点操作和/或括号使用。

为什么#< <不能以同样的方式工作#push呢?其中一个不是别人的别名吗?

+1

比较此附加vs扩展在python http:// stackoverflow。com/questions/252703 – dreftymac

回答

69

它们非常相似,但不完全相同。

<<接受一个参数,并将其推到数组的末尾。

push另一方面,接受一个或多个参数,将它们推到最后。

<<只接受单个对象的原因是您看到错误的原因。

+1

为了扩展这个,你可以用+ =来简写'推'2个数组。使用<<将单个值添加到数组。 – TomDunning

+0

@Isotope - 创建额外的对象,所以它应该被认为是反模式,除非你真的不想修改第一个数组。 – x1a4

+0

我确实认为当前版本的Ruby确实允许“<<”采用多个参数。 –

9

之所以<<不起作用,push做的是:

  1. push可以接受许多参数(这就是当你做*b会发生什么)。
  2. <<只接受一个参数。
0

push方法将一个项目追加到数组的末尾。它可以有多个参数。 <<用于初始化数组,并且只能有一个参数,如果已经初始化,则在数组末尾添加一个元素。

6

阵列#之间的主要区别< <和Array#推是

Array#<< # can be used to insert only single element in the Array 

Array#push # can be used to insert more than single element in the Array 

另一个显著不同的是, 在插入单一元件的情况下,

阵列#< <比阵列#更快推

Benchmarking可以帮助找出这两种方式的表现,查找更多here

6

这里需要注意的另一个要点是<<也是一个操作符。它比一些像三元运算符这样的运算符具有更低的优先级。这可能会导致一些意想不到的结果。例如:

arr1, arr2 = [], [] 

arr1.push true ? 1 : 0 
arr1 
# => [1] 

arr2 << true ? 1 : 0 
arr2 
# => [true] 
相关问题