how exit a block?

G

Greg Willits

I found a suggestion that says to use return, but this generates a
syntax error

colors = ['red', 'yellow', 'green', 'blue']

colors.each do |color|
p color
return color if color == 'yellow'
end

My actual code is a little different but I am assuming whatever
technique solves the above would solve what I need as well.

Seems like a simple syntax need, but I'm not finding a conclusive
solution. Probably right in front of me, so sorry if it's major
obvious...

-- gw
 
S

Stefano Crocco

I found a suggestion that says to use return, but this generates a
syntax error

colors = ['red', 'yellow', 'green', 'blue']

colors.each do |color|
p color
return color if color == 'yellow'
end

My actual code is a little different but I am assuming whatever
technique solves the above would solve what I need as well.

Seems like a simple syntax need, but I'm not finding a conclusive
solution. Probably right in front of me, so sorry if it's major
obvious...

-- gw

break color if color == 'yellow'

Stefano
 
J

Joshua Ballanco

Greg said:
I found a suggestion that says to use return, but this generates a
syntax error

Using 'return' will break you out of a method. If you want to use it to
break out of a loop, wrap your loop in a method. i.e.:

#!/usr/bin/ruby

@colors = %w(red blue yellow green)
def find_yellow
@colors.each do |color|
p color
return color if color == 'yellow'
end
end

puts "I found #{find_yellow}"

HTH,

Josh
 
G

Greg Willits

Stefano said:
break color if color == 'yellow'


Oi. yep, break is what I was looking for. I guess I've just never come
across it anywhere (and googling anything ruby with "exit block" turns
up 40 billion exit function discussions).

Thx

-- gw
 
J

Joshua Abbott

Have you tried using detect?

colors = ['red', 'yellow', 'green', 'blue']
yellow = colors.detect { |color| color == 'yellow' }

Detect runs the block on each element until the first that returns true.
colors = ['red', 'yellow', 'green', 'blue'] => ["red", "yellow", "green", "blue"]
yellow = colors.detect { |color| color == 'yellow' }
=> "yellow"

-- Josh
 
T

Tomasz BÅ‚ajek

Greg said:
I found a suggestion that says to use return, but this generates a
syntax error

colors = ['red', 'yellow', 'green', 'blue']

colors.each do |color|
p color
return color if color == 'yellow'
end

My actual code is a little different but I am assuming whatever
technique solves the above would solve what I need as well.

Seems like a simple syntax need, but I'm not finding a conclusive
solution. Probably right in front of me, so sorry if it's major
obvious...

-- gw

Your question is not what you really want to ask about.

You don't want to exit the block. You want to exit the loop that is
inside the each method. And you break out from loops using break.

Just exiting the block would be useless, because you would still be
inside the loop, and the each would just go on to the next iteration. In
fact, you exit the block each time control gets to the end of the block
normally, but then the block is called again in the next iteration.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,202
Messages
2,571,055
Members
47,659
Latest member
salragu

Latest Threads

Top