2013-06-05 12 views
7

corro il seguente codice:Come iterare su tutti, ma primo elemento di un enumerabile

> a = [1,2,3].collect 
=> #<Enumerator: [1, 2, 3]:collect> 
> b = a.next 
=> 1 
> a.each do |x| puts x end 
1 
2 
3 
=> [nil, nil, nil] 

mi aspetterei il risultato del do essere 2, 3 dal momento che ho già letto il primo elemento di a. Come ottengo un risultato elegante con lo 2, 3?

Edit:

Per chiarire, io non voglio saltare la prima voce, voglio solo per elaborare in modo diverso. Quindi voglio sia il b che il ciclo.

risposta

26

ne dici di questo?

[1,2,3].drop(1).each {|x| puts x } 
# >> 2 
# >> 3 

Ecco come si può continuare a camminare all'iteratore

a = [1,2,3] 

b = a.each # => #<Enumerator: [1, 2, 3]:each> 
b.next # skip first one 

loop do 
    c = b.next 
    puts c 
end 
# >> 2 
# >> 3 
+0

+1 mi ha battuto di 29 secondi :) –

+0

@Anand: e ho anche un esempio di output :) –

+0

In effetti, qualcosa che ho bisogno di imparare da voi :) –

2

Prova questo:

a.shift  
a.each do |x| puts x end 
+0

Ho modificato gli ans. Controlla ora. – Deepika

+1

Muta l'array originale –

3

Si potrebbe fare

a.drop(1).each do |x| puts x end 

EDIT:

Utilizzare il metodo map

b = [1,2,3].drop(1).map{|x| x} 
=> b will be [2, 3] 
+0

Questo funziona, c'è qualcosa di più elegante, ad es. qualcosa che non mi richiede di replicare la rimozione del primo elemento? – Stefan

+0

@Stefan Sì, ho dato una risposta come per voi.Verificare se soddisfa le vostre esigenze o meno. –

0

Provate il seguente codice

a=[1,2,3] 
a.drop(1) 
1

Come sidenote, se si sta cercando di mappare più di tutti, ma il primo elemento di un array, array.drop (1) .map {}, ovviamente, non sarà lavoro. Invece, puoi fare qualcosa del tipo:

[1,2,3].instance_eval { |a| [a.first] + a.drop(1).map { |e| e + 1 } } 
+0

dio, ti amo così tanto –

+0

Gli sviluppatori di Ruby sono molto più appassionati degli sviluppatori .NET –

Problemi correlati