DEV Community

Real Louise Belcher
Real Louise Belcher

Posted on

Ruby Flow Control: next vs break vs return

Ruby gives you elegant ways to control your code flow. Three keywords stand out when working with blocks: next, break, and return. Let's make them crystal clear.

The Basics: Iterating Collections

Most of the time in Ruby we work with and process collections of data. There are multiple methods that iterate over collection of data and process them. Here's a simple example:

numbers = (1..5).each do |number|
  puts "Processing number: #{number}"
end
# Processing number: 1
# Processing number: 2
# Processing number: 3
# Processing number: 4
# Processing number: 5
Enter fullscreen mode Exit fullscreen mode

But what if you need to skip items? Or stop processing early? That's where our these three very useful keywords come in: next, break, and return.

The next Keyword: Skip and Continue

Think of next as your "skip to the next item" command. It's perfect when you want to ignore certain elements but keep processing the rest.

numbers = (1..5).each do |number|
  next if number.even?    # Skip even numbers
  puts "Found odd number: #{number}"
end
# Found odd number: 1
# Found odd number: 3
# Found odd number: 5
Enter fullscreen mode Exit fullscreen mode

Here, next skips even numbers but continues processing the rest. It's like having a bouncer who lets some people skip the line.

The break Keyword: Stop Everything

break is your emergency exit. When you hit a break, the block stops executing immediately. It's useful when you've found what you're looking for or hit a condition where continuing makes no sense.

numbers = (1..5).each do |number|
  break if number > 3    # Stop when we exceed 3
  puts "Current number: #{number}"
end
# Current number: 1
# Current number: 2
# Current number: 3
Enter fullscreen mode Exit fullscreen mode

The return Keyword: Exit the Method

While return works in blocks, it's primarily meant for methods. Using return in a block will exit both the block AND the enclosing method. It's like pulling the emergency brake - everything stops.

def process_numbers
  (1..5).each do |number|
    return if number.even?    # Exit the entire method
    puts "Processing: #{number}"
  end
  puts "This line never runs if we hit return"
end

process_numbers
# Processing: 1
Enter fullscreen mode Exit fullscreen mode

Choosing the Right Tool

Here's when to use each:

  • Use next when you want to:

    • Skip the current iteration
    • Continue with the next item
    • Keep the loop running
  • Use break when you want to:

    • Stop the iteration completely
    • Exit the current block
    • Continue executing code after the block
  • Use return when you want to:

    • Exit the entire method
    • Return a value from the method
    • Note: Be careful with this in blocks!

Real-World Example

Here's a practical example combining these concepts:

def find_user(users)
  result = users.each do |user|
    next if user.inactive?     # Skip to next user, continue searching
    break user if user.admin?  # Stop searching, return admin via result
    return user if user.moderator?  # Exit method immediately with moderator
    process_regular_user(user)
  end

  puts "Only reached if no moderator found"
  result # Returns admin (if found via break) or from processing regular_user
end
Enter fullscreen mode Exit fullscreen mode

Remember

  • next skips to the next iteration
  • break exits the current block
  • return exits the entire method

Keep it simple. Use next and break for block control flow. Save return for method returns. Your code will be clearer and your intentions more obvious.

These tools are powerful. Use them wisely, and your Ruby code will flow like water.

Top comments (0)