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
return 'ask another question’
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
r = 'ask another question’
end
r
end
end

irb(main):018:0> x = meth 74
=> "ask another question"
irb(main):019:0> puts x
ask another question
=> 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
return 'ask another question’
end
end
end

def block_meth
yield
end

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


(Nobuyoshi Nakada) #3

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?

Return to where? The next statement of yield?
If so, you may want “next”.

···


Nobu Nakada


(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):006:3* return 'ask another question’
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
=> "ask another question"
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
return "ask another question"
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
From: nobu.nokada@softhome.net
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?

Return to where? The next statement of yield?
If so, you may want “next”.


(Nobuyoshi Nakada) #7

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.

···


Nobu Nakada


(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
From: nobu.nokada@softhome.net
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?

Return to where? The next statement of yield?
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…
:slight_smile:

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
From: nobu.nokada@softhome.net
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.

ATTN: please update your address books with address below!

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

EMAIL :: Ara [dot] T [dot] Howard [at] noaa [dot] gov
PHONE :: 303.497.6469
ADDRESS :: E/GC2 325 Broadway, Boulder, CO 80305-3328
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 :wink:

nobu’s reply was the answer - your response works here but i also had a bunch
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
From: nobu.nokada@softhome.net
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?

Return to where? The next statement of yield?
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… :slight_smile:

EMAIL :: Ara [dot] T [dot] Howard [at] noaa [dot] gov
PHONE :: 303.497.6469
ADDRESS :: E/GC2 325 Broadway, Boulder, CO 80305-3328
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.