Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Newbie question about multiple assignments

Reply
Thread Tools

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


 
Reply With Quote
 
 
 
 
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
>





 
Reply With Quote
 
 
 
 
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]

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


 
Reply With Quote
 
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]
>
> So, your expression
>
> 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=
 
Reply With Quote
 
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]
>>
>> 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:

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

Karl Allmark




 
Reply With Quote
 
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


 
Reply With Quote
 
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]
> >>
> >> 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:
>
> a, b = [b,(a = a), b]
>
> Karl Allmark
>


Sorry I meant Micheal's explaination




 
Reply With Quote
 
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]
>>
>> 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








--
Michael Ulm
R&D Team
ISIS Information Systems Austria
tel: +43 2236 27551-219, fax: +43 2236 21081
e-mail: (E-Mail Removed)
Visit our Website: www.isis-papyrus.com


 
Reply With Quote
 
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]
>>
>> 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
(E-Mail Removed)

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


 
Reply With Quote
 
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


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Question on 802.11b channel assignments pfisterfarm Cisco 3 03-29-2010 01:47 PM
Namespaces, multiple assignments, and exec() John O'Hagan Python 3 12-20-2008 03:44 PM
Question about concurrent signal assignments mamu VHDL 4 12-11-2008 04:41 PM
Multiple assignments simplification bearophileHUGS@lycos.com Python 3 10-13-2005 01:06 PM
multiple assignments with a HoHoA Abhinav Perl Misc 6 09-17-2004 12:24 PM



Advertisments