Как я могу вернуть что-то раньше из блока?

Если бы я хотел сделать что-то вроде этого:

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

   ..many lines of code here..
end

Как мне получить этот эффект? Я знаю, что могу просто обернуть все внутри блока в большом выражении if, но я хотел бы избежать возможности вложенности, если это возможно.

Break здесь не работает, потому что я не хочу останавливать итерацию оставшихся элементов.

Ответ 1

next внутри блока возвращается из блока. break внутри блока возвращается функция, возвращаемая блоку. Для each это означает, что break завершает цикл, а next переходит к следующей итерации цикла (таким образом, имена). Вы можете возвращать значения с помощью next value и break value.

Ответ 2

#!/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}"

Ответ 3

В этом случае вы можете использовать break для завершения цикла раньше:

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

... конечно, это предполагает, что вы на самом деле не хотите возвращать значение, просто выходите из блока.