2012-08-02 11 views
5

Ho un array. Ho bisogno di tenere tutto tranne l'elemento all'indice 0. Il mio cervello è fritto a questo punto. Ho programmato tutto il giorno. Qualsiasi aiuto sarebbe fantastico. Grazie!Ruby Rimuovi il primo indice di un array

+2

http://whathaveyoutried.com? –

risposta

14

Utilizzare il metodo Array#shift, che fa esattamente quello che vuoi :

a = [1, 2, 3] 
a.shift # => 1 
a # => [2, 3] 
+0

Avrei giurato di averlo già provato. Sembrava così facile. Devo aver appena avuto un errore di battitura o qualcosa del genere. Grazie –

+4

Per un divertente (volgare) mnemonico che aiuti a ricordare se 'shift' o' unshift' rimuove gli elementi dall'array, prova a rilasciare la "f" dal nome. :) – Phrogz

+0

@Phrogz: lol, lo adoro. – maerics

7

Si potrebbe utilizzare indice di matrice affettare:

some_array[1..-1] 

o, se si desidera modificare in modo permanente una variabile, howsabout:

some_array = [1,2,3,4] 
some_array.delete_at(0) 
# => 1 
some_array 
# => [2,3,4] 
1

seconda di come quello che sarà fatto con il risultato (un array con il primo elemento rimosso) ci sono diversi modi per ottenere il risultato e come verranno utilizzati possono influenzare la scelta.

Un modo cambia l'array originale in un nuovo array con il primo elemento rimosso applicando un metodo, ignorando il risultato di tale metodo e ottenendo il risultato desiderato a causa dell'effetto collaterale del metodo applicato. L'OP ha accettato una risposta che ha fatto questo (che implica ha funzionato nel suo caso):

a = [ "a", "b", "c" ] 
a.shift #=> "a" 
a #=> ["b", "c"] 

che funziona bene se si desidera che la matrice risultante conservato ma il tuo bisogno è far cadere qualche metodo nel bel mezzo di una catena dei metodi esistenti al fine di "sbarazzarsi di quel primo elemento dell'array". Ma nel mio caso avevo un array in cui il primo elemento era una linea di prua prodotta da un comando di sistema seguito da diverse righe dell'output da quel comando, uno in ciascun elemento dell'array e stava modificando le linee per ottenere il risultato desiderato quando si rese conto che la riga di intestazione doveva essere rimossa poiché, essendo di una forma diversa dalle linee rimanenti, non era gestita correttamente e non era necessaria. La mia linea di codice originale sembrava qualcosa di simile (dove ancora una volta, a è la matrice):

puts a.method1.method2.method3.method4 

e ho voluto fare questo:

puts a.method1.method2.removeFirstElement.method3.method4 

Un modo per farlo utilizzando slice è stato mostrato in una risposta diversa anche se non è stato chiarito come potrebbe essere meglio in alcuni casi che la risposta accettata:

puts a.method1.method2.slice(1..-1).method3.method4 

Se ho usato la risposta accettata avrei ettari ve a fare qualcosa di simile:

temp = a.method1.method2 
temp.shift 
puts temp.method3.method4 

Oltre alla necessità di rivedere la struttura del codice originale (anche se ci sono pro e contro a che a seconda di ciò che è stato fatto), è necessario creare un nuovo oggetto temporaneo ('temporanea ') solo per arrivare al risultato.

È bello sapere che dove ci stiamo dirigendo spesso ha un deciso effetto su come arrivarci.

(ti faccio notare che avrei quasi preferire l'uso di slice!(0) al posto di shift per cambiare realmente la matrice dal momento che il punto esclamativo indica chiaramente che l'array è stato cambiato, il metodo shift non è conforme al corrente suggerimento di aggiungere un punto esclamativo per i metodi che cambierà un oggetto. Ma, ahimè, probabilmente sarei utilizzare shift in ogni caso per evitare l'ingombro del (0).)

Problemi correlati