[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Programming Ruby book p.50 (Fibonacci yield example

Mike Glaz

3/3/2007 5:13:00 PM

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

6 Answers

Ola Bini

3/3/2007 5:26:00 PM

0

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.bl...)
JvYAML, RbYAML, JRuby and Jatha contributor
System Developer, Karolinska Institutet (http:/...)
OLogix Consulting (http://www....)

"Yields falsehood when quined" yields falsehood when quined.


Sebastian Hungerecker

3/3/2007 5:31:00 PM

0

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

Gary Wright

3/3/2007 5:34:00 PM

0


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




Mike Glaz

3/3/2007 5:58:00 PM

0

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

Chad Perrin

3/4/2007 5:21:00 AM

0

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.ap... ]
"There comes a time in the history of any project when it becomes necessary
to shoot the engineers and begin production." - MacUser, November 1990

obstinate.jack@gmail.com

3/4/2007 6:54:00 AM

0

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