Ruby – Differenza tra array # << e matrice # push

Dall’esame della documentazione per Ruby 1.9.3, sia l’array # << che l'array # push sono stati progettati per implementare l'aggiunta di un elemento alla fine dell'array corrente. Tuttavia, sembrano esserci sottili differenze tra i due.

Quello che ho incontrato è che l’operatore * può essere usato per aggiungere il contenuto di un intero altro array a quello corrente, ma solo con #push.

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

Il tentativo di usare # # dà invece vari errori, a seconda che sia usato con l’operatore punto e / o parentesi.

Perché # # non funziona allo stesso modo #push? Uno non è in realtà un alias per l’altro?

Sono molto simili, ma non identici.

<< accetta un singolo argomento e lo spinge alla fine dell'array.

push , d'altra parte, accetta uno o più argomenti, spingendoli tutti verso la fine.

Il fatto che << accetta solo un singolo object è il motivo per cui vedi l'errore.

Il motivo per cui << non funziona e push fa è questo:

  1. push può accettare molti argomenti (che è ciò che accade quando fai *b ).
  2. << accetta solo un singolo argomento.

Un altro punto importante da notare qui è che << è anche un operatore. E ha una precedenza inferiore rispetto ad alcuni operatori come l'operatore ternario. Ciò potrebbe portare a risultati inaspettati. per esempio:

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

La principale differenza tra Array # << e 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 

Un'altra differenza significativa è, in caso di inserimento di un singolo elemento,

Array # << è più veloce di Array # push

Il benchmarking può aiutare a scoprire le prestazioni di questi due modi, trova di più qui .

Il metodo push aggiunge un elemento alla fine dell’array. Può avere più di un argomento. << è usato per inizializzare l'array e può avere un solo argomento, aggiunge un elemento alla fine dell'array se già inizializzato.