2011-01-04 18 views
5

Zapomniałem, jak śledzić położenie pętli w Ruby. Zazwyczaj piszę w AS3, JavaScript, Java, itpJak śledzić zmienne licznika w ruby, blok, dla, każdego, czy

each:

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

for:

samo

while:

samo

block

Word.each {|w,x| } 

Tego naprawdę nie wiem.

+0

Jakie jest twoje pytanie? Nie rozumiem, o co prosisz. –

+0

Ah, wiedziałem, że to było niewyraźne. Jak śledzić zmienne licznika. – s84

Odpowiedz

8

Oprócz metody Ruby 1.8 Array#each_with_index, wiele metod wyliczeniowych w Rubim 1.9 zwraca moduł wyliczający, gdy zostanie wywołany bez bloku; można następnie wywołać metodę with_index mieć wyliczający przechodzą również po indeksie:

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} 

Jeśli chcesz map.with_index lub select.with_index (lub podobne) w Ruby 1.8.x, można zrobić to wiertarko-ale- szybka metoda:

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

czy można mieć więcej zabawy funkcjonalne:

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

Jeśli użyjesz each_with_index zamiast each, otrzymasz indeks wraz z elementem. Więc można zrobić:

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

Dla while pętle nadal będziesz musiał śledzić licznik samodzielnie.

+0

Tak właśnie szukam, ale mam ich więcej. – s84

+1

@Sam: Nie jestem pewien, jaki większy obraz masz na myśli. – sepp2k

+0

lol, myślę, że nie pamiętam. Domyślam się, że mam na myśli to, że w javascriptie można zainicjować licznik w pętli, ale w rubinie nie wydaje się to intuicyjne, ponieważ licznik powinien tam być. Nie? – s84

3

stolica W oznaczałoby to jest stałą, która najprawdopodobniej znaczy, że jest klasa lub moduł, a nie instancja klasy. Sądzę, że mógłbyś zwrócić klasę, którą można wyliczyć używając każdego z nich, ale wydaje się to bardzo dziwne.

Aby usunąć mylące dodatkowe śmieci i, ewentualnie, niepoprawnie napisany wielkimi literami, chciałbym, aby mój kod wyglądał tak.

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

Nie jestem pewien, co robił Sepp2K z dziwnym (słowo, x).

Powiązane problemy