Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Programming Ruby book p.50 (Fibonacci yield example)

Reply
Thread Tools

Programming Ruby book p.50 (Fibonacci yield example)

 
 
Mike Glaz
Guest
Posts: n/a
 
      03-03-2007
here's the example:

1. def fib_up_to(max)
2. i1,i2 = 1,1
3. while i1 <= max
4. yield i1
5. i1, i2=i2, i1+i2
6. end
7. end
8.
9. fib_up_to(1000) {|f| print f, " "}

I'm familiar with yield passing values to the block and vice-versa. But
I have no clue what is happenening in line 5. Or at least in general
can anyone explain what is going on here in these 9 lines of code?
(I've been programming for 10 years so I'm familiar methods, loops, etc.
it's just this yield thing I don't completely understand especially line
5.).

cheers,
mike

--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
Ola Bini
Guest
Posts: n/a
 
      03-03-2007
Mike Glaz wrote:
> here's the example:
>
> 1. def fib_up_to(max)
> 2. i1,i2 = 1,1
> 3. while i1 <= max
> 4. yield i1
> 5. i1, i2=i2, i1+i2
> 6. end
> 7. end
> 8.
> 9. fib_up_to(1000) {|f| print f, " "}
>
> I'm familiar with yield passing values to the block and vice-versa. But
> I have no clue what is happenening in line 5. Or at least in general
> can anyone explain what is going on here in these 9 lines of code?
> (I've been programming for 10 years so I'm familiar methods, loops, etc.
> it's just this yield thing I don't completely understand especially line
> 5.).
>
> cheers,
> mike
>


Hi Mike,

What's happening at line 5 is a swap. The code is equivalent to this:

tmp = i1+i2
i1 = i2
i2 = tmp

Hope that helps.
--
Ola Bini (http://ola-bini.blogspot.com)
JvYAML, RbYAML, JRuby and Jatha contributor
System Developer, Karolinska Institutet (http://www.ki.se)
OLogix Consulting (http://www.ologix.com)

"Yields falsehood when quined" yields falsehood when quined.


 
Reply With Quote
 
 
 
 
Sebastian Hungerecker
Guest
Posts: n/a
 
      03-03-2007
Mike Glaz wrote:
> 1. def fib_up_to(max)
> 2. i1,i2 = 1,1
> 3. while i1 <= max
> 4. yield i1
> 5. i1, i2=i2, i1+i2
> 6. end
> 7. end
> 8.
> 9. fib_up_to(1000) {|f| print f, " "}
>
> I'm familiar with yield passing values to the block and vice-versa. But
> I have no clue what is happenening in line 5.


Line 5 has nothing to do with the yield (which in this case just displays the
current value of i1). It assigns the value of i2 to i1 and the sum of the
values of i1 (before the assignment) and i2 to i2.


> (I've been programming for 10 years so I'm familiar methods, loops, etc.
> it's just this yield thing I don't completely understand especially line
> 5.).


Like I said: The yield (in line 4) only displays the value and line 5 has
nothing to do with yield.

HTH,
Sebastian
--
NP: Dire Straits - So Far Away
Ist so, weil ist so
Bleibt so, weil war so

 
Reply With Quote
 
Gary Wright
Guest
Posts: n/a
 
      03-03-2007

On Mar 3, 2007, at 12:13 PM, Mike Glaz wrote:
> 5. i1, i2=i2, i1+i2

[...]
> But I have no clue what is happenening in line 5.


The spacing in your text is a bit misleading.
This makes it a little clearer:

i1,i2 = i2,(i1+i2)

This is Ruby's multiple assignment statement. The
expressions on the right are evaluated into a list and
assigned, in order, to the variables on the left.

Gary Wright




 
Reply With Quote
 
Mike Glaz
Guest
Posts: n/a
 
      03-03-2007
Ok thanx guys. I just found that multiple assignment is not explained
until p.91 of the text while this example is on page 50 ... strange.,
> mike



--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
Chad Perrin
Guest
Posts: n/a
 
      03-04-2007
On Sun, Mar 04, 2007 at 02:34:00AM +0900, Gary Wright wrote:
>
> On Mar 3, 2007, at 12:13 PM, Mike Glaz wrote:
> >5. i1, i2=i2, i1+i2

> [...]
> >But I have no clue what is happenening in line 5.

>
> The spacing in your text is a bit misleading.
> This makes it a little clearer:
>
> i1,i2 = i2,(i1+i2)
>
> This is Ruby's multiple assignment statement. The
> expressions on the right are evaluated into a list and
> assigned, in order, to the variables on the left.


I probably would have done it thusly:

i1, i2 = i2, i1 + i2
. . or:
i1, i2 = [i2, i1 + i2]

. . or something to that effect. Somehow, it seems more readable to
me. YMMV.

Do my versions for any particular reason seem unlike the typical Ruby
idiom for some reason? I'm curious.

--
CCD CopyWrite Chad Perrin [ http://ccd.apotheon.org ]
"There comes a time in the history of any project when it becomes necessary
to shoot the engineers and begin production." - MacUser, November 1990

 
Reply With Quote
 
obstinate.jack@gmail.com
Guest
Posts: n/a
 
      03-04-2007
I happen to have this book as well. There's actually a comment
immediate to the right of the line i1, i2 = 1, 1 and says # parallel
assignment (i1 = 1 and i2 =1)

i1, i2 = i2, i1+i2
is another way of writing
temp = i1
i1 = i2
i2 = temp+i2

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
[ANN] To Yield or Not to Yield: An Inferable Question Michael Edgar Ruby 13 04-21-2011 05:55 PM
yield expression programmized-formal interpretation. (interpretationof yield expression.) castironpi@gmail.com Python 1 04-22-2008 01:32 AM
Ruby 1.9 : What is the use for Proc#yield Gregory Brown Ruby 2 06-24-2007 03:34 PM
Yield & associations (was Proc / def /yield semantics) Markus Ruby 1 09-27-2004 07:04 PM
callbacks in ruby and using yield in resursion Paul Ruby 5 07-17-2003 01:19 PM



Advertisments