2011-01-04 8 views
5

Ho dimenticato come tenere traccia della posizione dei loop in Ruby. Di solito scrivo in JavaScript, AS3, Java, eccCome tenere traccia delle variabili contatore in ruby, block, for, each, do

each:

counter = 0 
Word.each do |word,x| 
    counter += 1 
    #do stuff 
end 

for:

stessa cosa

while:

stessa cosa

block

Word.each {|w,x| } 

Questo non lo so davvero.

+0

Qual è la tua domanda? Non capisco cosa stai chiedendo. –

+0

Ah, sapevo che era vago. Come tenere traccia delle variabili del contatore. – s84

risposta

8

In aggiunta al metodo Array#each_with_index di Ruby 1.8, molti metodi di enumerazione in Ruby 1.9 restituiscono un Enumeratore quando viene chiamato senza blocco; quindi è possibile chiamare il metodo with_index di avere l'enumeratore passano anche lungo l'indice:

irb(main):001:0> a = *('a'..'g') 
#=> ["a", "b", "c", "d", "e", "f", "g"] 

irb(main):002:0> a.map 
#=> #<Enumerator:0x28bfbc0> 

irb(main):003:0> a.select 
#=> #<Enumerator:0x28cfbe0> 

irb(main):004:0> a.select.with_index{ |c,i| i%2==0 } 
#=> ["a", "c", "e", "g"] 

irb(main):005:0> Hash[ a.map.with_index{ |c,i| [c,i] } ] 
#=> {"a"=>0, "b"=>1, "c"=>2, "d"=>3, "e"=>4, "f"=>5, "g"=>6} 

Se volete map.with_index o select.with_index (o simile) sotto Rubino 1.8.x, è possibile fare questo noioso-ma- metodo veloce:

i = 0 
a.select do |c| 
    result = i%2==0 
    i += 1 
    result 
end 

o ci si può divertire più funzionale:

a.zip((0...a.length).to_a).select do |c,i| 
    i%2 == 0 
end.map{ |c,i| c } 
5

Se si utilizza each_with_index anziché each, verrà visualizzato un indice insieme all'elemento. Così si può fare:

Word.each_with_index do |(word,x), counter| 
    #do stuff 
end 

Per while loop avrai ancora per tenere traccia del contatore da soli.

+0

Sì, questo è quello che cerco ma un'immagine più grande di tutti loro. – s84

+1

@ Sam: Non sono sicuro del tipo di immagine più grande che intendi. – sepp2k

+0

lol, immagino di non ricordare. Immagino che cosa intendo è come in javascript puoi inizializzare il contatore nel ciclo ma in ruby ​​questo non sembra intuitivo perché il contatore dovrebbe essere lì. no? – s84

3

a W capitale sarebbe dire che è una costante che molto probabilmente significa che sia una classe o un modulo non un'istanza di una classe. Immagino che potresti avere un ritorno di classe enumerabile usando ciascuno, ma sembra molto bizzarro.

Per rimuovere la junk extra confusa e l'esempio, possibilmente, in modo errato in maiuscolo, renderei il mio codice simile a questo.

words = get_some_words() 
words.each_with_index do |word, index| 
    puts "word[#{index}] = #{word}" 
end 

Non sono sicuro di cosa stesse facendo Sepp2K con la cosa strana (parola, x).