2012-05-13 77 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] 
相關問題