[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Newbie question about multiple assignments

Alex

1/12/2006 10:25:00 AM


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


16 Answers

David Vallner

1/12/2006 11:06:00 AM

0

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?
>
> What is the order for the assignments
>




Michael Ulm

1/12/2006 12:39:00 PM

0

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: michael.ulm@isis-papyrus.com
Visit our Website: www.isis-papyrus.com


David Vallner

1/12/2006 12:50:00 PM

0

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

Karl Allmark

1/12/2006 1:07:00 PM

0

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




David Vallner

1/12/2006 1:14:00 PM

0

On Thu, 12 Jan 2006 14:06:56 +0100, Karl Allmark
<karl.allmark@citytechnology.com> wrote:

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

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

a, b = [b, *[a = [a, b]]]

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

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

David Vallner


Karl Allmark

1/12/2006 1:21:00 PM

0



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

Sorry I meant Micheal's explaination :-(




Michael Ulm

1/12/2006 1:46:00 PM

0

David Vallner wrote:

> 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.
>>
>
>
> 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: michael.ulm@isis-papyrus.com
Visit our Website: www.isis-papyrus.com


dblack

1/12/2006 2:09:00 PM

0

David Vallner

1/12/2006 8:08:00 PM

0

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.

David Vallner


Andrew McGuinness

1/12/2006 10:06:00 PM

0

David Vallner wrote:
> 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]
>>
>
>
> 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:

irb(main):094:0> puts( a,b = 1,2 )
1
1
2
=> nil
irb(main):095:0> puts( ( a,b = 1,2 ) )
1
2
=> nil



irb(main):103:0> a,b=1,2
=> [1, 2]
irb(main):104:0> a,b=(b,a=a,b)
=> [1, 2]
irb(main):105:0> a
=> 1
irb(main):106:0> b
=> 2