Issue #12593 has been updated by Naja Melan.


What I propose is to translate the construct:

~~~ ruby
a = 3
b = [ 2 ]

a, b = 2, 3, 4

a == 2
b == 3

# 4 is ignored

a, b = 2

a == 2
b == nil
~~~


That's current behaviour if the number of elements is not the same on both sides.

~~~ ruby
a,b += 2, 3, 4

# translates to:

a = a + 2
b = b + 3

# 4 is ignored.
# `+': no implicit conversion of Fixnum into Array (TypeError)

a, b += 2

a = a + 2
b = b + nil
~~~


If you just translate the statement, There is is no special case to take into account, the interpreter will just do it's job on the translated statement.

Obviously you have to make special accomodation for everything that you want to work:

~~~ ruby
if a, b < c, d     # would become:

if a < c && b < d  # then && is arbitrary, matter of convention, that someone has to decide on.
~~~

but whatever wouldn't work because nobody has wanted to implement it, well it already doesn't work today, so that's no change then.


----------------------------------------
Feature #12593: Allow compound assignements to work when destructuring arrays
https://bugs.ruby-lang.org/issues/12593#change-59683

* Author: Naja Melan
* Status: Open
* Priority: Normal
* Assignee: 
----------------------------------------
~~~ ruby
a = [ 'a', 'b' ]
b = [ 'c', 'd' ]

def c

    return [ 'A', 'B' ], [ 'C', 'D' ]

end

a, b += c # -> would be awesome, but gives syntax error

a, b = a + c.first, b + c.last # clunky and will call method twice...

# current realistic use:
t, tt = c
a += t
b += tt

# desired result
#
p a == [ 'a', 'c', 'A', 'B' ] #-> true
p b == [ 'b', 'd', 'C', 'D' ] #-> true
~~~

I would propose that as 

~~~ ruby
a, b = [ c, d ] # is equivalent to:
a = c 
b = d

a, b += [ c, d ] # would be equivalent to:
a += c
b += d
~~~

This not working surprised me. It could work with all compound assignment operators I think. Maybe even with some other operators.




-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>