Does the following code behave as you'd expect?
2.times{|n| i,j = n,i; puts "i=#{i}, j=#{j.inspect}"}
Can you explain why j is nil rather than 0, the second time round?
Thanks,
Robin
Does the following code behave as you'd expect?
2.times{|n| i,j = n,i; puts "i=#{i}, j=#{j.inspect}"}
Can you explain why j is nil rather than 0, the second time round?
Thanks,
Robin
"robin" <robin.houston@gmail.com> wrote/schrieb <1169920481.252703.112350@a75g2000cwd.googlegroups.com>:
2.times{|n| i,j = n,i; puts "i=#{i}, j=#{j.inspect}"}
Can you explain why j is nil rather than 0, the second time round?
I'll try. Everytime the block is executed, new variables n, i and j
are created, because they don't already exist outside the block. If
you want i to be shared, it should already exist before, e.g.:
i = nil
2.times{|n| i,j = n,i; puts "i=#{i}, j=#{j.inspect}"}
Regards
Thomas
"robin" <robin.houston@gmail.com> wrote/schrieb <
1169920481.252703.112350@a75g2000cwd.googlegroups.com>:> 2.times{|n| i,j = n,i; puts "i=#{i}, j=#{j.inspect}"}
>
> Can you explain why j is nil rather than 0, the second time round?I'll try. Everytime the block is executed, new variables n, i and j
are created, because they don't already exist outside the block. If
you want i to be shared, it should already exist before, e.g.:i = nil
2.times{|n| i,j = n,i; puts "i=#{i}, j=#{j.inspect}"}
maybe OP thought that
i,j = n,i
is semantically equivalent to
i=n
j=i
but it is not :(, which is good
the assignments are performed in parallel, and i is still nil when assigned
to j.
But this is very useful thus one can e.g. swap
the value of two variables as follows
a,b = b,a
HTH
Robert
On 1/27/07, Thomas Hafner <thomas@hafner.nl.eu.org> wrote:
Regards
Thomas
--
"The best way to predict the future is to invent it."
- Alan Kay
Thanks for the reply. I think I've succeeded in adjusting my mental
model enough that this now makes sense.
Robin
On Jan 27, 6:24 pm, Thomas Hafner <tho...@hafner.NL.EU.ORG> wrote:
I'll try. Everytime the block is executed, new variables n, i and j
are created, because they don't already exist outside the block. If
you want i to be shared, it should already exist before, e.g.:i = nil
2.times{|n| i,j = n,i; puts "i=#{i}, j=#{j.inspect}"}