Issue #10617 has been updated by Eregon (Benoit Daloze).
This is now allowed, but produces a warning:
~~~
$ ruby -e 'if (a, b = 1, 2); puts "y"; end'
-e:1: warning: found = in conditional, should be ==
y
$ ruby -W0 -e 'if (a, b = 1, 2); puts "y"; end'
y
~~~
Is that expected?
It seems to only happen with literals though:
~~~
$ ruby -e 'if (a, b = 1, 2); puts "y"; end'
-e:1: warning: found = in conditional, should be ==
y
$ ruby -e 'if (a, b = 1, 2.itself); puts "y"; end'
y
~~~
----------------------------------------
Feature #10617: Change multiple assignment in conditional from parse error to warning
https://bugs.ruby-lang.org/issues/10617#change-67622
* Author: recursive-madman (Recursive Madman)
* Status: Closed
* Priority: Normal
* Assignee:
* Target version:
----------------------------------------
There is currently an inconsistency between regular and multiple assignment in conditionals.
Regular assignment causes a **warning**, multiple assignment causes a **parse error**.
The historical reason for this is that in 1.8 multiple assignment would always return an Array, but since 1.9 it returns whatever the RHS evaluates to.
**Examples:**
```ruby
a, b = nil #=> nil
a, b = [] #=> [] (but a and b are both nil)
a, b = 1,2 #=> [1, 2]
```
Since multiple assignment behavior has changed, it makes sense to remove the (artificial) parse error for multiple assignments.
That makes it possible to test the return value of a method used for multiple assignment without having to use a temporary variable.
**Example:**
```ruby
# CURRENTLY WORKING CODE:
tmp = some_method_returning_array_or_nil
a, b = tmp
if tmp
# method returned an array (possibly empty)
else
# method returned nil.
end
# PROPOSED WORKING CODE:
if(a, b = some_method_returning_array_or_nil)
# method returned an array (possibly empty)
else
# method returned nil
end
```
(the parenthesis are needed due to LALR limitations, as discussed in #10450)
Attached is a patch that does the necessary change.
---Files--------------------------------
0001-turn-parse-error-on-multiple-assignment-into-warning.patch (752 Bytes)
--
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>