2012-05-13 25 views
39

Al examinar la documentación de Ruby 1.9.3, tanto Array # < < como Array # push fueron diseñados para implementar la adición de un elemento al final de la matriz actual. Sin embargo, parece haber diferencias sutiles entre los dos.Ruby - Diferencia entre Array # << y Array # push

El que he encontrado es que el operador * se puede usar para agregar el contenido de una matriz completa a la actual, pero solo con #push.

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

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

El intento de utilizar # < < vez da varios errores, dependiendo de si se utiliza con el operador punto y/o paréntesis.

¿Por qué # < < no funciona de la misma manera que #push? ¿Uno no es realmente un alias para el otro?

+1

comparar esto para agregar vs extender en python http: // stackoverflow.com/questions/252703 – dreftymac

Respuesta

69

Son muy similares, pero no idénticos.

<< acepta un único argumento y lo empuja hacia el final de la matriz.

push, por otro lado, acepta uno o más argumentos, empujándolos hasta el final.

El hecho de que << solo acepte un solo objeto es la razón por la que está viendo el error.

+1

Para ampliar esto, puede taquicar '2 matrices' con + =. Use << para agregar un valor único a una matriz. – TomDunning

+0

@Isotopo - Eso crea objetos adicionales, por lo que debe considerarse un antipatrón a menos que realmente no desee modificar la primera matriz. – x1a4

+0

Creo que la versión actual de Ruby permite que el "<<" abarque más de un argumento. –

9

La razón por la << no funciona y push hace es que:

  1. push puede aceptar muchos argumentos (que es lo que sucede cuando se hace *b).
  2. << solo acepta un solo argumento.
0

El método push agrega un elemento al final de la matriz. Puede tener más de un argumento. << se utiliza para inicializar la matriz y puede tener solo un argumento, agrega un elemento al final de la matriz si ya se ha inicializado.

6

La principal diferencia entre el arreglo # < < y el arreglo # empuje es

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 

Otra diferencia significativa es, En caso de insertar un solo elemento,

Matriz # < < es más rápido que el arreglo # push

Benchmarking pueden ayudar a descubrir el rendimiento de estas dos formas, encuentre más here .

6

Otro punto importante a tener en cuenta aquí es que << también es un operador. Y tiene una prioridad menor que algunos operadores como el operador ternario. Esto podría conducir a algunos resultados inesperados. por ejemplo:

arr1, arr2 = [], [] 

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

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