Ruby - Array#<<和Array#push之间的区别

Rav*_*rag 50 ruby arrays append

通过检查Ruby 1.9.3的文档,Array#<<和Array#push被设计为实现将元素附加到当前数组的末尾.但是,两者之间似乎存在微妙的差异.

我遇到的是*运算符可用于将整个其他数组的内容追加到当前数组,但只能使用#push.

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

a.push *b
=> [1,2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)

尝试使用#<<代替它会产生各种错误,具体取决于它是否与点运算符和/或括号一起使用.

为什么#<<不像#push那样工作?一个人实际上不是另一个的别名吗?

x1a*_*1a4 81

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

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

push另一方面,接受一个或多个论点,将它们全部推到最后.

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


Aks*_*ite 10

Array#<<和Array#push的主要区别在于

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
Run Code Online (Sandbox Code Playgroud)

另一个显着的区别是,在插入单个元素的情况下,

Array#<<比Array#push快

基准测试有助于找出这两种方式的表现,在这里找到更多.


Dav*_*ser 9

之所以<<不起作用,那push是因为:

  1. push可以接受很多参数(当你这样做时会发生这种情况*b).
  2. << 只接受一个参数.


San*_*osh 7

这里需要注意的另一个重点是,<<它也是一个运营商.并且它的优先级低于三元运算符等一些运算符.这可能会导致一些意想不到的结果.例如:

arr1, arr2 = [], []

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

arr2 << true ? 1 : 0
arr2
# => [true] 
Run Code Online (Sandbox Code Playgroud)