Как я могу вернуть что-то рано из блока? - PullRequest
79 голосов
/ 25 марта 2010

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

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

   ..many lines of code here..
end

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

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

Ответы [ 3 ]

157 голосов
/ 25 марта 2010

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

10 голосов
/ 25 марта 2010
#!/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}"
5 голосов
/ 25 марта 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...