To your why, another why: why do you need to use multiple parallel assignments in one statement? That said, parallel assignments are somewhat known to be a rather messy bit of syntax I'm apparently not as savvy with as I thought, since I can't make heads or tails of what is really happening.
My personal tip woukd be that the assignments are associative right-to-left, and only the leftmost assignment is evaluated as a parallel one.
What probably happens is broken down into simpler statements:
a = a, b # a == [1, 2]
a, b = b, *a # a ==2, b==1
where the return value of the expression is the rvalue.
So the end values are what you expect, just the return value of the expression isn't.
Hint: it's easy to avoid obscure syntax, so do that if possible. Noone really admires godawful one-liners from hell in code he expects to understand a week after writing it, even if there is a certain charm to getting things done with them
Also, parallel assignment syntax is undergoing certain subtle, but significant changes that seem to resolve some of the ambiguity - you might want to look on one of the webpages that summarize changes in Ruby 1.9.
David Vallner
···
On Thu, 12 Jan 2006 11:24:45 +0100, Alex <AlexAfrasinei@yahoo.com> wrote:
irb(main):091:0> a=1
=> 1
irb(main):092:0> b=2
=> 2
irb(main):093:0> a,b=b,a
=> [2, 1]
irb(main):094:0> a=1
=> 1
irb(main):095:0> b=2
=> 2
irb(main):096:0> a, b = b, a = a, b
=> [2, 1, 2] <-- Why?
irb(main):091:0> a=1
=> 1
irb(main):092:0> b=2
=> 2
irb(main):093:0> a,b=b,a
=> [2, 1]
irb(main):094:0> a=1
=> 1
irb(main):095:0> b=2
=> 2
irb(main):096:0> a, b = b, a = a, b
=> [2, 1, 2] <-- Why?
What is the order for the assignments
Keep in mind, that
a, b = c, d
is just shorthand for
a, b = [c, d]
So, your expression
a, b = b, a = a, b
gets parsed as
a, b = [b, a = a, b]
and thus produces the observed behaviour.
HTH,
Michael
···
--
Michael Ulm
R&D Team
ISIS Information Systems Austria
tel: +43 2236 27551-219, fax: +43 2236 21081
e-mail: michael.ulm@isis-papyrus.com
Visit our Website: www.isis-papyrus.com
That doesn't seem to explain the return value [2, 1, 2] of the expression.
David Vallner
···
On Thu, 12 Jan 2006 13:39:00 +0100, Michael Ulm <michael.ulm@isis-papyrus.com> wrote:
Alex wrote:
irb(main):091:0> a=1
=> 1
irb(main):092:0> b=2
=> 2
irb(main):093:0> a,b=b,a
=> [2, 1]
irb(main):094:0> a=1
=> 1
irb(main):095:0> b=2
=> 2
irb(main):096:0> a, b = b, a = a, b
=> [2, 1, 2] <-- Why?
What is the order for the assignments
irb(main):091:0> a=1
=> 1
irb(main):092:0> b=2
=> 2
irb(main):093:0> a,b=b,a
=> [2, 1]
irb(main):094:0> a=1
=> 1
irb(main):095:0> b=2
=> 2
irb(main):096:0> a, b = b, a = a, b
=> [2, 1, 2] <-- Why?
What is the order for the assignments
Keep in mind, that
a, b = c, d
is just shorthand for
a, b = [c, d]
So, your expression
a, b = b, a = a, b
gets parsed as
a, b = [b, a = a, b]
and thus produces the observed behaviour.
HTH,
Michael
That doesn't seem to explain the return value [2, 1, 2] of the expression.
David Vallner
Hi List
Just getting up to speed with ruby myself, try reading Davids explaination
as:
irb(main):091:0> a=1
=> 1
irb(main):092:0> b=2
=> 2
irb(main):093:0> a,b=b,a
=> [2, 1]
irb(main):094:0> a=1
=> 1
irb(main):095:0> b=2
=> 2
irb(main):096:0> a, b = b, a = a, b
=> [2, 1, 2] <-- Why?
What is the order for the assignments
Keep in mind, that
a, b = c, d
is just shorthand for
a, b = [c, d]
So, your expression
a, b = b, a = a, b
gets parsed as
a, b = [b, a = a, b]
and thus produces the observed behaviour.
That doesn't seem to explain the return value [2, 1, 2] of the expression.
Why not? the return value of an assignment is the right hand
side. In this case [2, 1 , 2]. The first and last value there
coming from b, and the middle value is the return value of the
assignment a = a.
Try this:
irb(main):001:0> a, b = [1, 2, 3, 4] # sets a=1 and b=2
=> [1, 2, 3, 4]
irb(main):002:0> a, b = [1, c = 2, 3] # sets a=1, b=2, and c = 2
=> [1, 2, 3]
HTH,
Michael
···
On Thu, 12 Jan 2006 13:39:00 +0100, Michael Ulm > <michael.ulm@isis-papyrus.com> wrote:
--
Michael Ulm
R&D Team
ISIS Information Systems Austria
tel: +43 2236 27551-219, fax: +43 2236 21081
e-mail: michael.ulm@isis-papyrus.com
Visit our Website: www.isis-papyrus.com
On Thu, 12 Jan 2006 13:39:00 +0100, Michael Ulm > <michael.ulm@isis-papyrus.com> wrote:
Alex wrote:
irb(main):091:0> a=1
=> 1
irb(main):092:0> b=2
=> 2
irb(main):093:0> a,b=b,a
=> [2, 1]
irb(main):094:0> a=1
=> 1
irb(main):095:0> b=2
=> 2
irb(main):096:0> a, b = b, a = a, b
=> [2, 1, 2] <-- Why?
What is the order for the assignments
Keep in mind, that
a, b = c, d
is just shorthand for
a, b = [c, d]
So, your expression
a, b = b, a = a, b
gets parsed as
a, b = [b, a = a, b]
and thus produces the observed behaviour.
HTH,
Michael
That doesn't seem to explain the return value [2, 1, 2] of the expression.
An assignment expression returns its right-hand side. In this case,
that's [b, a = a, b]:
a = 1
b = 2
[b, a = a, b] => [2,1,2]
David
--
David A. Black
dblack@wobblini.net
"Ruby for Rails", from Manning Publications, coming April 2006!
-----Original Message-----
From: Karl Allmark [mailto:karl.allmark@citytechnology.com]
Sent: 12 January 2006 14:07
To: ruby-talk ML
Subject: Re: Newbie question about multiple assignments
>> Alex wrote:
>>> irb(main):091:0> a=1
>>> => 1
>>> irb(main):092:0> b=2
>>> => 2
>>> irb(main):093:0> a,b=b,a
>>> => [2, 1]
>>> irb(main):094:0> a=1
>>> => 1
>>> irb(main):095:0> b=2
>>> => 2
>>> irb(main):096:0> a, b = b, a = a, b
>>> => [2, 1, 2] <-- Why?
>>> What is the order for the assignments
>>>
>>
>> Keep in mind, that
>>
>> a, b = c, d
>>
>> is just shorthand for
>>
>> a, b = [c, d]
>>
>> So, your expression
>>
>> a, b = b, a = a, b
>>
>> gets parsed as
>>
>> a, b = [b, a = a, b]
>>
>> and thus produces the observed behaviour.
>>
>> HTH,
>>
>> Michael
>>
>>
>
>
>That doesn't seem to explain the return value [2, 1, 2] of
the expression.
>
>David Vallner
Hi List
Just getting up to speed with ruby myself, try reading Davids
explaination
as:
Ah well, for some strange reason I thought the parser would check for a parallel assignment form inside the array constructor as well. Apparently not... Right, that example pretty much clears the issue up.
David Vallner
···
On Thu, 12 Jan 2006 15:09:01 +0100, <dblack@wobblini.net> wrote:
An assignment expression returns its right-hand side. In this case,
that's [b, a = a, b]:
An assignment expression returns its right-hand side. In this case,
that's [b, a = a, b]:
a = 1
b = 2
[b, a = a, b] => [2,1,2]
Ah well, for some strange reason I thought the parser would check for a parallel assignment form inside the array constructor as well. Apparently not... Right, that example pretty much clears the issue up.
Within method arguments, the "," gets parsed as an argument separator not an array separator:
On Thu, 12 Jan 2006 15:09:01 +0100, <dblack@wobblini.net> wrote:
An assignment expression returns its right-hand side. In this case,
that's [b, a = a, b]:
a = 1
b = 2
[b, a = a, b] => [2,1,2]
David
Ah well, for some strange reason I thought the parser would check for a parallel assignment form inside the array constructor as well. Apparently not... Right, that example pretty much clears the issue up.
The thing is, if you've got an array [a,b], and you add to it so that
it is [a,b,c=1], the meaning of the "a,b" part doesn't change; rather,
you're understood to have added an element. The comma semantics are
different in these different contexts, in other words.
David
--
David A. Black
dblack@wobblini.net
"Ruby for Rails", from Manning Publications, coming April 2006!