# Return from yielded block

(Ara.T.Howard) #1

i saw something like this recently on clr but can’t seem to find it …

what i want to do is something like

value = meth 42

where

def meth n
block_meth do
if n == 42
return 'forty-two’
else
end
end
end

def block_meth
yield
end

the problem is that you can’t ‘return’ from a block - so how is this done?

-a

···

(short)

(Kirk Haines) #2

def block_meth
yield
end

def meth n
block_meth do
r = nil
if n == 42
r = 'forty two’
else
end
r
end
end

irb(main):018:0> x = meth 74
irb(main):019:0> puts x
=> nil
irb(main):020:0> y = meth 42
=> "forty two"
irb(main):021:0> puts y
forty two
=> nil

Is that what you are looking for?

Kirk Haines

···

On Fri, 13 Feb 2004, Ara.T.Howard wrote:

what i want to do is something like

value = meth 42

where

def meth n
block_meth do
if n == 42
return 'forty-two’
else
end
end
end

def block_meth
yield
end

the problem is that you can’t ‘return’ from a block - so how is this done?

Hi,

At Fri, 13 Feb 2004 14:54:56 +0900,
Ara.T.Howard wrote in [ruby-talk:92771]:

the problem is that you can’t ‘return’ from a block - so how is this done?

If so, you may want “next”.

···

(Laurent Julliard) #4

this works…

irb(main):001:0> def meth n
irb(main):002:1> block_meth do
irb(main):003:2* if n == 42
irb(main):004:3> return 'forty-two’
irb(main):005:3> else
irb(main):007:3> end
irb(main):008:2> end
irb(main):009:1> end
=> nil
irb(main):010:0>
irb(main):011:0* def block_meth
irb(main):012:1> yield
irb(main):013:1> end
=> nil
irb(main):014:0> meth 10
irb(main):015:0> meth 42
=> “forty-two”

Maybe you wan “next” ?

···

il Thu, 12 Feb 2004 22:40:12 -0700, “Ara.T.Howard” Ara.T.Howard@noaa.gov ha scritto::

i saw something like this recently on clr but can’t seem to find it …

#5

Hi Ara,

“Ara.T.Howard” Ara.T.Howard@noaa.gov wrote in message news:Pine.LNX.4.44.0402122235510.31453-100000@fattire.ngdc.noaa.gov
[…]

the problem is that you can’t ‘return’ from a block - so how is this done?

-a

I think the return is returning from the yielding procedure rather
than the block, as the following demonstrates:

def meth n
block_meth do
if n == 42
return 'forty-two’
end
end
end

def block_meth
yield
end

puts meth(42)
puts meth(40)

(Ara.T.Howard) #6

return a value. i was not clear enough, let me try again:

def meth s
x =
block_meth do
if s =~ /forty/
return 40
else
return 0
end
end
x + 2
end

def block_meth; yield; end

p(meth(‘forty’)) # this prints 40 - i want it to print 42

-a

···

On Fri, 13 Feb 2004 nobu.nokada@softhome.net wrote:

Date: Fri, 13 Feb 2004 15:08:34 +0900
Newsgroups: comp.lang.ruby
Subject: Re: return from yielded block

Hi,

At Fri, 13 Feb 2004 14:54:56 +0900,
Ara.T.Howard wrote in [ruby-talk:92771]:

the problem is that you can’t ‘return’ from a block - so how is this done?

If so, you may want “next”.

Hi,

At Sat, 14 Feb 2004 00:54:55 +0900,
Ara.T.Howard wrote in [ruby-talk:92793]:

return a value. i was not clear enough, let me try again:

def meth s
x =
block_meth do
if s =~ /forty/
return 40
else
return 0
end
end
x + 2
end

def block_meth; yield; end

p(meth(‘forty’)) # this prints 40 - i want it to print 42

Use break or next instead of return.

···

(Robert) #8

“Ara.T.Howard” ahoward@fattire.ngdc.noaa.gov schrieb im Newsbeitrag
news:Pine.LNX.4.44.0402130622000.31453-100000@fattire.ngdc.noaa.gov

Date: Fri, 13 Feb 2004 15:08:34 +0900
Newsgroups: comp.lang.ruby
Subject: Re: return from yielded block

Hi,

At Fri, 13 Feb 2004 14:54:56 +0900,
Ara.T.Howard wrote in [ruby-talk:92771]:

the problem is that you can’t ‘return’ from a block - so how is this
done?

If so, you may want “next”.

return a value. i was not clear enough, let me try again:

def meth s
x =
block_meth do
if s =~ /forty/
return 40
else
return 0
end
end
x + 2
end

def block_meth; yield; end

p(meth(‘forty’)) # this prints 40 - i want it to print 42

Simply delete the “return”'s:

irb(main):001:0> def meth s
irb(main):002:1> x =
irb(main):003:1* block_meth do
irb(main):004:2* if s =~ /forty/
irb(main):005:3> 40
irb(main):006:3> else
irb(main):007:3* 0
irb(main):008:3> end
irb(main):009:2> end
irb(main):010:1> x + 2
irb(main):011:1> end
=> nil
irb(main):012:0>
irb(main):013:0* def block_meth; yield; end
=> nil
irb(main):014:0>
irb(main):015:0* p(meth(‘forty’)) # this prints 40 - i want it to print 42
42
=> nil
irb(main):016:0>

I guess you are aware of the fact that this kind of construction is a bit,
err, complicated and your real world code does a lot more in between…

Regards

``````robert
``````
···

On Fri, 13 Feb 2004 nobu.nokada@softhome.net wrote:

(Kirk Haines) #9

Again:

irb(main):001:0> def block_meth
irb(main):002:1> yield
irb(main):003:1> end
=> nil
irb(main):004:0> def meth s
irb(main):005:1> x = block_meth do
irb(main):006:2* if s =~ /forty/
irb(main):007:3> r = 40
irb(main):008:3> else
irb(main):009:3* r = 0
irb(main):010:3> end
irb(main):011:2> r
irb(main):012:2> end
irb(main):013:1> x + 2
irb(main):014:1> end
=> nil
irb(main):015:0> puts meth(‘forty’)
42
=> nil

Is this what you want, or am I misunderstanding?

Kirk Haines

···

On Sat, 14 Feb 2004, Ara.T.Howard wrote:

return a value. i was not clear enough, let me try again:

def meth s
x =
block_meth do
if s =~ /forty/
return 40
else
return 0
end
end
x + 2
end

def block_meth; yield; end

p(meth(‘forty’)) # this prints 40 - i want it to print 42

(Karl von Laudermann) #10

“Ara.T.Howard” ahoward@fattire.ngdc.noaa.gov wrote in message news:Pine.LNX.4.44.0402130622000.31453-100000@fattire.ngdc.noaa.gov

return a value. i was not clear enough, let me try again:

def meth s
x =
block_meth do
if s =~ /forty/
return 40
else
return 0
end
end
x + 2
end

def block_meth; yield; end

p(meth(‘forty’)) # this prints 40 - i want it to print 42

The problem is that “return” returns from the enclosing method. The
code works as you want it to if you take out the “return” keywords,
like this:

def meth s
x =
block_meth do
if s =~ /forty/
40
else
0
end
end
x + 2
end

def block_meth; yield; end

p(meth(‘forty’)) # this prints 42

(Ara.T.Howard) #11

thanks! thought i tried that - guess not. i like the look of

break 40

but not

next 40

are the semantics exactly the same?

-a

···

On Sat, 14 Feb 2004 nobu.nokada@softhome.net wrote:

Date: Sat, 14 Feb 2004 01:03:03 +0900
Newsgroups: comp.lang.ruby
Subject: Re: return from yielded block

Hi,

At Sat, 14 Feb 2004 00:54:55 +0900,
Ara.T.Howard wrote in [ruby-talk:92793]:

return a value. i was not clear enough, let me try again:

def meth s
x =
block_meth do
if s =~ /forty/
return 40
else
return 0
end
end
x + 2
end

def block_meth; yield; end

p(meth(‘forty’)) # this prints 40 - i want it to print 42

Use break or next instead of return.

===============================================================================

EMAIL :: Ara [dot] T [dot] Howard [at] noaa [dot] gov
PHONE :: 303.497.6469
STP :: http://www.ngdc.noaa.gov/stp/
NGDC :: http://www.ngdc.noaa.gov/
NESDIS :: http://www.nesdis.noaa.gov/
NOAA :: http://www.noaa.gov/
US DOC :: http://www.commerce.gov/

The difference between art and science is that science is what we
understand well enough to explain to a computer.
Art is everything else.
– Donald Knuth, “Discover”

/bin/sh -c ‘for l in ruby perl;do \$l -e “print “\x3a\x2d\x29\x0a””;done’
===============================================================================

(Ara.T.Howard) #12

yes. and yes - about 1700 lines to be exact

of stuff after the if/else/end : it was not the default return value. for
some reason i just didn’t explain myself well enough - sorry. the bottom line
is that i needed a way to prematurely ‘return’ a value from a yielded block
under \$DEBUG/\$NOOP conditions for testing…

cheers.

-a

···

On Fri, 13 Feb 2004, Robert Klemme wrote:

Date: Fri, 13 Feb 2004 17:04:33 +0100
From: Robert Klemme bob.news@gmx.net
Newsgroups: comp.lang.ruby
Subject: Re: return from yielded block

“Ara.T.Howard” ahoward@fattire.ngdc.noaa.gov schrieb im Newsbeitrag
news:Pine.LNX.4.44.0402130622000.31453-100000@fattire.ngdc.noaa.gov

On Fri, 13 Feb 2004 nobu.nokada@softhome.net wrote:

Date: Fri, 13 Feb 2004 15:08:34 +0900
Newsgroups: comp.lang.ruby
Subject: Re: return from yielded block

Hi,

At Fri, 13 Feb 2004 14:54:56 +0900,
Ara.T.Howard wrote in [ruby-talk:92771]:

the problem is that you can’t ‘return’ from a block - so how is this
done?

If so, you may want “next”.

return a value. i was not clear enough, let me try again:

def meth s
x =
block_meth do
if s =~ /forty/
return 40
else
return 0
end
end
x + 2
end

def block_meth; yield; end

p(meth(‘forty’)) # this prints 40 - i want it to print 42

Simply delete the “return”'s:

irb(main):001:0> def meth s
irb(main):002:1> x =
irb(main):003:1* block_meth do
irb(main):004:2* if s =~ /forty/
irb(main):005:3> 40
irb(main):006:3> else
irb(main):007:3* 0
irb(main):008:3> end
irb(main):009:2> end
irb(main):010:1> x + 2
irb(main):011:1> end
=> nil
irb(main):012:0>
irb(main):013:0* def block_meth; yield; end
=> nil
irb(main):014:0>
irb(main):015:0* p(meth(‘forty’)) # this prints 40 - i want it to print 42
42
=> nil
irb(main):016:0>

I guess you are aware of the fact that this kind of construction is a bit,
err, complicated and your real world code does a lot more in between…

# –

EMAIL :: Ara [dot] T [dot] Howard [at] noaa [dot] gov
PHONE :: 303.497.6469
URL :: http://www.ngdc.noaa.gov/stp/
TRY :: for l in ruby perl;do \$l -e “print “\x3a\x2d\x29\x0a””;done
===============================================================================

(Yukihiro Matsumoto) #13

Hi,

···

In message “Re: return from yielded block” on 04/02/14, “Ara.T.Howard” ahoward@fattire.ngdc.noaa.gov writes:

def meth s
x =
block_meth do
if s =~ /forty/
return 40
else
return 0
end
end
x + 2
end

def block_meth; yield; end

p(meth(‘forty’)) # this prints 40 - i want it to print 42

Use break or next instead of return.

are the semantics exactly the same?

No. “break” terminates “block_meth”, “next” terminates “yield”.

``````						matz.
``````