return from yielded block

A

Ara.T.Howard

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
 
N

nobu.nokada

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".
 
G

gabriele renzi

il Thu, 12 Feb 2004 22:40:12 -0700, "Ara.T.Howard"
i saw something like this recently on clr but can't seem to find it ...


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" ?
 
G

Ged

Hi Ara,

Ara.T.Howard said:
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)
 
A

Ara.T.Howard

Date: Fri, 13 Feb 2004 15:08:34 +0900
From: (e-mail address removed)
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


-a
 
N

nobu.nokada

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.
 
R

Robert Klemme

Ara.T.Howard said:
Date: Fri, 13 Feb 2004 15:08:34 +0900
From: (e-mail address removed)
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...
:)

Regards

robert
 
A

Ara.T.Howard

Date: Sat, 14 Feb 2004 01:03:03 +0900
From: (e-mail address removed)
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.

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
--

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'
===============================================================================
 
A

Ara.T.Howard

Date: Fri, 13 Feb 2004 17:04:33 +0100
From: Robert Klemme <[email protected]>
Newsgroups: comp.lang.ruby
Subject: Re: return from yielded block


Ara.T.Howard said:
Date: Fri, 13 Feb 2004 15:08:34 +0900
From: (e-mail address removed)
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... :)

yes. and yes - about 1700 lines to be exact ;-)

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
--
===============================================================================
| 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
===============================================================================
 
K

Karl von Laudermann

Ara.T.Howard said:
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
 
Y

Yukihiro Matsumoto

Hi,

In message "Re: return from yielded block"

|> > 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.
 

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
473,767
Messages
2,569,572
Members
45,046
Latest member
Gavizuho

Latest Threads

Top