Programming Ruby book p.50 (Fibonacci yield example)

Discussion in 'Ruby' started by Mike Glaz, Mar 3, 2007.

  1. Mike Glaz

    Mike Glaz Guest

    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/.
     
    Mike Glaz, Mar 3, 2007
    #1
    1. Advertising

  2. Mike Glaz

    Ola Bini Guest

    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.
     
    Ola Bini, Mar 3, 2007
    #2
    1. Advertising

  3. 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
     
    Sebastian Hungerecker, Mar 3, 2007
    #3
  4. Mike Glaz

    Gary Wright Guest

    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
     
    Gary Wright, Mar 3, 2007
    #4
  5. Mike Glaz

    Mike Glaz Guest

    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/.
     
    Mike Glaz, Mar 3, 2007
    #5
  6. Mike Glaz

    Chad Perrin Guest

    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
     
    Chad Perrin, Mar 4, 2007
    #6
  7. Mike Glaz

    Guest

    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
     
    , Mar 4, 2007
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    1
    Views:
    342
    Gabriel Genellina
    Apr 22, 2008
  2. Markus
    Replies:
    1
    Views:
    218
    Mark Hubbart
    Sep 27, 2004
  3. John Maclean
    Replies:
    7
    Views:
    156
    Dave Thomas
    Jan 17, 2006
  4. RichardOnRails
    Replies:
    2
    Views:
    161
    RichardOnRails
    Feb 4, 2011
  5. Michael Edgar
    Replies:
    13
    Views:
    307
    Brian Candler
    Apr 21, 2011
Loading...

Share This Page