К сожалению, Ruby немного отличается. PS: моя память немного туманна, поэтому извиняюсь, если я ошибаюсь
вместо break / continue, он имеет break / next, который ведет себя одинаково с точки зрения циклов
Циклы (как и все остальное) являются выражениями и «возвращают» последнее, что они сделали. В большинстве случаев получение возвращаемого значения из цикла бессмысленно, поэтому каждый просто делает это
a = 5
while a < 10
a + 1
end
Однако вы можете сделать это
a = 5
b = while a < 10
a + 1
end # b is now 10
ОДНАКО, много кода ruby «эмулирует» цикл, используя блок. Канонический пример
10.times do |x|
puts x
end
Поскольку люди гораздо чаще хотят делать что-то с результатом блока, именно здесь он становится беспорядочным. break / next означает разные вещи в контексте блока.
перерыв выпрыгнет из кода, который вызвал блок
next пропустит остальную часть кода в блоке и вернет то, что вы указали, вызывающему блоку. Это не имеет никакого смысла без примеров.
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.
Так что да. Ruby потрясающий, но у него есть несколько ужасных угловых случаев. Это второй худший из тех, что я видел за годы его использования :-)