How can I return something early from a block?

If I wanted to do something like this:

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

   ..many lines of code here..
end

How would I get that effect? I know I could just wrap everything inside the block in a big if statement, but I’d like to avoid the nesting if possible.

Break would not work here, because I do not want to stop iteration of the remaining elements.

  • How to get multiple-line user input in Ruby?
  • How can I install a ruby gem that cannot be found?
  • Rails: Display Maintenance Page if No Database Connection Available
  • Language in a Sandbox in Rails
  • RoR - How to remove Rails 4.1.1 version?
  • Save all user entries from html text built off a loop using ruby and sinatra
  • RSpec any_instance deprecation: how to fix it?
  • Ruby on Rails, Paperclip, Amazon AWS S3 & Heroku
  • 3 Solutions collect form web for “How can I return something early from a block?”

    next inside a block returns from the block. break inside a block returns from the function that yielded to the block. For each this means that break exits the loop and next jumps to the next iteration of the loop (thus the names). You can return values with next value and break value.

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

    In this instance, you can use break to terminate the loop early:

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

    …of course, this is assuming that you’re not actually looking to return a value, just break out of the block.

    Ruby is the best programming language in the world - Ruby on Rails.