Velocity Reviews > Ruby > Newbie question about multiple assignments

# Newbie question about multiple assignments

Alex
Guest
Posts: n/a

 01-12-2006

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

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

David Vallner
Guest
Posts: n/a

 01-12-2006
To your why, another why: why do you need to use multiple parallel =20
assignments in one statement? That said, parallel assignments are somewha=
t =20
known to be a rather messy bit of syntax I'm apparently not as savvy with=
=20
as I thought, since I can't make heads or tails of what is really =20
happening.

My personal tip woukd be that the assignments are associative =20
right-to-left, and only the leftmost assignment is evaluated as a paralle=
l =20
one.

What probably happens is broken down into simpler statements:

a =3D a, b # a =3D=3D [1, 2]
a, b =3D b, *a # a =3D=3D2, b=3D=3D1

where the return value of the expression is the rvalue.

So the end values are what you expect, just the return value of the =20
expression isn't.

Hint: it's easy to avoid obscure syntax, so do that if possible. Noone =20
really admires godawful one-liners from hell in code he expects to =20
understand a week after writing it, even if there is a certain charm to =20
getting things done with them

Also, parallel assignment syntax is undergoing certain subtle, but =20
significant changes that seem to resolve some of the ambiguity - you migh=
t =20
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 <(E-Mail Removed)> wrote:

>
> irb(main):091:0> a=3D1
> =3D> 1
> irb(main):092:0> b=3D2
> =3D> 2
> irb(main):093:0> a,b=3Db,a
> =3D> [2, 1]
> irb(main):094:0> a=3D1
> =3D> 1
> irb(main):095:0> b=3D2
> =3D> 2
> irb(main):096:0> a, b =3D b, a =3D a, b
> =3D> [2, 1, 2] <-- Why?
>
> What is the order for the assignments
>

Michael Ulm
Guest
Posts: n/a

 01-12-2006
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]

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: http://www.velocityreviews.com/forums/(E-Mail Removed)

David Vallner
Guest
Posts: n/a

 01-12-2006
On Thu, 12 Jan 2006 13:39:00 +0100, Michael Ulm =20
<(E-Mail Removed)> wrote:

> Alex wrote:
>> irb(main):091:0> a=3D1
>> =3D> 1
>> irb(main):092:0> b=3D2
>> =3D> 2
>> irb(main):093:0> a,b=3Db,a
>> =3D> [2, 1]
>> irb(main):094:0> a=3D1
>> =3D> 1
>> irb(main):095:0> b=3D2
>> =3D> 2
>> irb(main):096:0> a, b =3D b, a =3D a, b
>> =3D> [2, 1, 2] <-- Why?
>> What is the order for the assignments
>>

>
> Keep in mind, that
>
> a, b =3D c, d
>
> is just shorthand for
>
> a, b =3D [c, d]
>
>
> a, b =3D b, a =3D a, b
>
> gets parsed as
>
> a, b =3D [b, a =3D 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=

Karl Allmark
Guest
Posts: n/a

 01-12-2006
>> 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]
>>
>>
>> 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:

a, b = [b,(a = a), b]

Karl Allmark

David Vallner
Guest
Posts: n/a

 01-12-2006
On Thu, 12 Jan 2006 14:06:56 +0100, Karl Allmark =20
<(E-Mail Removed)> wrote:

>
> Hi List
>
> Just getting up to speed with ruby myself, try reading Davids =20
> explaination
> as:
>
> a, b =3D [b,(a =3D a), b]
>
> Karl Allmark
>
>
>

Not quite, what I had in mind would be this one-liner:

a, b =3D [b, *[a =3D [a, b]]]

I have a slight completely unfounded doubt the interpreter would =20
implicitly associate (a =3D a) in the middle of the expression.

The results observed in irb ARE however ambiguous with respect to both of=
=20
those possible interpretations.

David Vallner

Karl Allmark
Guest
Posts: n/a

 01-12-2006

> -----Original Message-----
> From: Karl Allmark [(E-Mail Removed)]
> 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]
> >>
> >>
> >> 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:
>
> a, b = [b,(a = a), b]
>
> Karl Allmark
>

Sorry I meant Micheal's explaination

Michael Ulm
Guest
Posts: n/a

 01-12-2006
David Vallner wrote:

> On Thu, 12 Jan 2006 13:39:00 +0100, Michael Ulm
> <(E-Mail Removed)> 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]
>>
>>
>> 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

--
Michael Ulm
R&D Team
ISIS Information Systems Austria
tel: +43 2236 27551-219, fax: +43 2236 21081
e-mail: (E-Mail Removed)

dblack@wobblini.net
Guest
Posts: n/a

 01-12-2006
Hi --

On Thu, 12 Jan 2006, David Vallner wrote:

> On Thu, 12 Jan 2006 13:39:00 +0100, Michael Ulm
> <(E-Mail Removed)> 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]
>>
>>
>> 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
(E-Mail Removed)

"Ruby for Rails", from Manning Publications, coming April 2006!
http://www.manning.com/books/black

David Vallner
Guest
Posts: n/a

 01-12-2006
On Thu, 12 Jan 2006 15:09:01 +0100, <(E-Mail Removed)> wrote:

>
> An assignment expression returns its right-hand side. In this case,
> that's [b, a =3D a, b]:
>
> a =3D 1
> b =3D 2
> [b, a =3D a, b] =3D> [2,1,2]
>
>
> David
>

Ah well, for some strange reason I thought the parser would check for a =20
parallel assignment form inside the array constructor as well. Apparently=
=20
not... Right, that example pretty much clears the issue up.

David Vallner