2010-03-25 16 views
65

Gdybym chciał zrobić coś takiego:Jak mogę zwrócić coś wcześniej z bloku?

collection.each do |i| 
    return nil if i == 3 

    ..many lines of code here.. 
end 

jak byłoby uzyskać taki efekt? Wiem, że mogłem po prostu zawrzeć wszystko wewnątrz bloku w dużej instrukcji if, ale jeśli to możliwe, chciałbym uniknąć zagnieżdżenia.

Przerwa nie zadziała tutaj, ponieważ wykonuję , a nie chcę zatrzymać iterację pozostałych elementów.

Odpowiedz

132

next wewnątrz bloku wraca z bloku. break wewnątrz bloku zwraca z funkcji, która przyniosła do bloku. Dla each oznacza to, że break wychodzi z pętli, a next przeskakuje do następnej iteracji pętli (stąd nazwy). Możesz zwrócić wartości za pomocą next value i break value.

+1

"następny" był tym, czego szukałem, dzięki. – ryeguy

+32

+1 dla "następnej wartości" i "wartości break". Dokładnie to, czego szukałem. –

+1

'break value' nie działało dla mnie, podczas gdy' next value' działało bez zarzutu. Wielkie dzięki. –

5

W tym przypadku można użyć przerwę, aby zakończyć pętlę wczesne:

collection.each do |i| 
    break if i == 3 
    ...many lines 
end 

... oczywiście, to jest przy założeniu, że nie jesteś rzeczywiście patrząc zwrócić wartość, po prostu wyrwać się z blok.

+0

To nie tylko wróci z bloku, ale powróci z każdego z nich. Więc pętla zakończy się, a nie będzie następna. Nie jestem pewien, czy to jest zamierzone. – sepp2k

+3

Możesz użyć wartości z 'break' w Ruby -' break 5' spowoduje, że 'each' zwróci 5. – Chuck

+1

Dzięki, ale nie chcę przerwać iteracji. – ryeguy

8
#!/usr/bin/ruby 

collection = [1, 2, 3, 4, 5 ] 

stopped_at = collection.each do |i| 
    break i if i == 3 

    puts "Processed #{i}" 
end 

puts "Stopped at and did not process #{stopped_at}" 
+0

Dzięki @jd, działa również z redukcją. – Joe

Powiązane problemy