Issue #10617 has been updated by Mike Campbell.


I find this really unintuitive and share some of 'bug hit's exasperation. It's clear that the return value, like everything, is either truthy or falsey, why treat this differently to everything else in Ruby?

It's particularly annoying because it prevents well known patterns from being used with tuples, for instance:

    while (a = queue.pop(true) rescue nil)
      # do something
    end

I see that quite a lot for exhausting a queue. However, when you want to use the same pattern with tuples Ruby arbitrarily restricts you:

    while (a, b = queue.pop(true) rescue nil)
      # do something
    end
    # SyntaxError: (irb):4: multiple assignment in conditional

The work-around with the throwaway variable is simple enough, but unintuitive. I understand from reading the other bug issue that this has historical relevance, but clearly this is no longer the case so I don't see any reason to object to it's removal.

----------------------------------------
Feature #10617: Change multiple assignment in conditional from parse error to warning
https://bugs.ruby-lang.org/issues/10617#change-57231

* Author: Recursive Madman
* Status: Open
* Priority: Normal
* Assignee: 
----------------------------------------
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>