На жаль, Рубі трохи відрізняється. PS: Моя пам'ять трохи туманна, тому вибачтесь, якщо я помиляюся
замість перерви / продовження, він має break / next, які ведуть себе однаково з точки зору циклів
Цикли (як і все інше) - це вирази, і "повертають" останнє, що вони зробили. Більшу частину часу отримувати повернене значення з циклу безглуздо, тому кожен просто робить це
a = 5
while a < 10
a + 1
end
Однак ви можете це зробити
a = 5
b = while a < 10
a + 1
end # b is now 10
ЗАРАЗ, багато рубінового коду "емулює" цикл, використовуючи блок. Канонічний приклад є
10.times do |x|
puts x
end
Оскільки людям набагато частіше хочеться робити речі з результатом блоку, саме тут стає брудно. break / 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.
Так що так. Рубі - дивовижна, але у неї є жахливі кутові випадки. Це другий найгірший, який я бачив за роки використання :-)