Forum: Ruby Question about exiting from a block

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Guoliang C. (Guest)
on 2009-06-05 01:34
def test
  puts 'before'
  yield 2
  puts 'after'
end

test do |i|
  XXX if i > 1
  # a lot of code appears below
end


I have code above and wonder if it is possible to use
return/break/anything to stop execution of block and return control to
test() to execute code after yield. I know it is impossible in 1.8. How
about 1.9? Does anyone feel this is an important feature to have?

Thank you.
Guoliang C.
Joel VanderWerf (Guest)
on 2009-06-05 01:51
(Received via mailing list)
Guoliang C. wrote:
>
>
> I have code above and wonder if it is possible to use
> return/break/anything to stop execution of block and return control to
> test() to execute code after yield. I know it is impossible in 1.8. How
> about 1.9? Does anyone feel this is an important feature to have?

It is possible in 1.8, using the next keyword:

def test
   puts 'before'
   yield 2
   puts 'after'
end

test do |i|
   next if i > 1
   puts "a lot of code"
end
matt neuburg (Guest)
on 2009-06-05 07:50
(Received via mailing list)
Guoliang C. <removed_email_address@domain.invalid> wrote:

>
>
> I have code above and wonder if it is possible to use
> return/break/anything to stop execution of block and return control to
> test() to execute code after yield. I know it is impossible in 1.8.

Why is it impossible? Doesn't "break" do what you need? (And remember,
"break" and "next" can even return a value from a block to the yielder.)
m.
Joel VanderWerf (Guest)
on 2009-06-05 11:03
(Received via mailing list)
matt neuburg wrote:
>>   # a lot of code appears below
>> end
>>
>>
>> I have code above and wonder if it is possible to use
>> return/break/anything to stop execution of block and return control to
>> test() to execute code after yield. I know it is impossible in 1.8.
>
> Why is it impossible? Doesn't "break" do what you need? (And remember,
> "break" and "next" can even return a value from a block to the yielder.)

Nope, break will skip the "after" line.
Guoliang C. (Guest)
on 2009-06-05 16:17
Joel VanderWerf wrote:
> Guoliang C. wrote:
>>
>>
>> I have code above and wonder if it is possible to use
>> return/break/anything to stop execution of block and return control to
>> test() to execute code after yield. I know it is impossible in 1.8. How
>> about 1.9? Does anyone feel this is an important feature to have?
>
> It is possible in 1.8, using the next keyword:
>
> def test
>    puts 'before'
>    yield 2
>    puts 'after'
> end
>
> test do |i|
>    next if i > 1
>    puts "a lot of code"
> end

This is great! I never thought of using 'next'.

Thank you!
Brian C. (Guest)
on 2009-06-05 16:22
Keeping it simple:

def test
  puts 'before'
  yield 2
  puts 'after'
end

test do |i|
  unless i > 1
    puts "a lot of code here"
  end
end

There's also throw/catch:

test do |i|
  catch(:done) do
    throw(:done) if i > 1
    puts "a lot of code here"
  end
end
Bertram S. (Guest)
on 2009-06-05 16:47
(Received via mailing list)
Hi,

Am Freitag, 05. Jun 2009, 06:48:43 +0900 schrieb Joel VanderWerf:
> Guoliang C. wrote:
>> I have code above and wonder if it is possible to use
>> return/break/anything to stop execution of block and return control to
>> test() to execute code after yield. I know it is impossible in 1.8. How
>> about 1.9?
>
> It is possible in 1.8, using the next keyword:

Slightly modified:

  def f ; puts "A" ; puts yield ; puts "Z" ; "F" ; end

  f { next  "X" ; puts "Y" }    #=> "F"
  puts "-"
  f { break "X" ; puts "Y" }    #=> "X"

The output is:

  A
  X
  Z
  -
  A

Will this work in 1.9, too?

Bertram
matt neuburg (Guest)
on 2009-06-05 19:15
(Received via mailing list)
Joel VanderWerf <removed_email_address@domain.invalid> wrote:

> >>   XXX if i > 1
>
> Nope, break will skip the "after" line.

Right, sorry about that. m.
This topic is locked and can not be replied to.