Ruby niestety jest nieco inny. PS: Moja pamięć jest trochę mglista, więc przepraszam, jeśli się mylę
zamiast break / kontynuuj ma break / next, które zachowują się tak samo pod względem pętli
Pętle (jak wszystko inne) są wyrażeniami i „zwracają” ostatnią rzecz, którą zrobili. W większości przypadków uzyskanie wartości zwracanej z pętli jest bezcelowe, więc wszyscy po prostu to robią
a = 5
while a < 10
a + 1
end
Możesz to jednak zrobić
a = 5
b = while a < 10
a + 1
end # b is now 10
JEDNAK, dużo kodu ruby „emuluje” pętlę za pomocą bloku. Kanonicznym przykładem jest
10.times do |x|
puts x
end
Ponieważ ludzie znacznie częściej chcą robić rzeczy z wynikiem bloku, w tym miejscu robi się bałagan. break / next oznacza różne rzeczy w kontekście bloku.
break wyskoczy z kodu, który wywołał blok
next pominie resztę kodu w bloku i „zwróci” to, co określisz, do dzwoniącego bloku. Bez przykładów nie ma to sensu.
def timesten
10.times{ |t| puts yield t }
end
timesten do |x|
x * 2
end
# will print
2
4
6
8 ... and so on
timesten do |x|
break
x * 2
end
# won't print anything. The break jumps out of the timesten function entirely, and the call to `puts` inside it gets skipped
timesten do |x|
break 5
x * 2
end
# This is the same as above. it's "returning" 5, but nobody is catching it. If you did a = timesten... then a would get assigned to 5
timesten do |x|
next 5
x * 2
end
# this would print
5
5
5 ... and so on, because 'next 5' skips the 'x * 2' and 'returns' 5.
Więc tak. Ruby jest niesamowity, ale ma kilka okropnych skrzynek. Jest to drugi najgorszy, jaki widziałem w latach użytkowania :-)