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

Posted

技术标签:

【中文标题】Ruby - Array#<< 和 Array#push 之间的区别【英文标题】:Ruby - Difference between Array#<< and Array#push 【发布时间】:2012-05-21 02:56:46 【问题描述】:

通过查看 Ruby 1.9.3 的文档,Array#&lt;&lt;Array#push 都旨在实现将元素附加到当前数组的末尾。但是,两者之间似乎存在细微差别。

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

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

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

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

为什么#&lt;&lt; 的工作方式与#push 的工作方式不同?一个实际上不是另一个的别名吗?

【问题讨论】:

比较这个在python中追加和扩展***.com/questions/252703 【参考方案1】:

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

&lt;&lt; 接受单个参数,并将其推送到数组的末尾。

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

&lt;&lt; 仅接受单个对象这一事实就是您看到错误的原因。

【讨论】:

要对此进行扩展,您可以使用 += 简写 'push' 2 个数组。使用 @Isotope - 这会创建额外的对象,因此除非您真的不想修改第一个数组,否则应将其视为反模式。 我相信当前版本的 Ruby 确实允许 " 【参考方案2】:

这里要注意的另一个重点是&lt;&lt;也是一个运算符,它的优先级低于或高于其他运算符。这可能会导致意想不到的结果。

例如,&lt;&lt; 的优先级高于三元运算符,如下所示:

arr1, arr2 = [], []

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

arr2 << true ? 1 : 0
arr2
# => [true] 

【讨论】:

【参考方案3】:

&lt;&lt;不起作用而push起作用的原因是:

    push 可以接受许多参数(当您执行 *b 时会发生这种情况)。 &lt;&lt; 只接受一个参数。

【讨论】:

【参考方案4】:

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

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

Array#

Benchmarking可以帮助了解这两种方式的性能,查找更多here。

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于Ruby - Array#<< 和 Array#push 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

ruby hash value array append new element

在Ruby中递归地展平数组[重复]

ruby 的 Hash.replace 或 Array.replace 有啥用?

Ruby on Rails - 从数组中删除某些内容

ruby入门知识:string的创建及使用方法详解

如何在Rails视图中将Ruby变量传递给JavaScript函数?