Issue #12860 has been updated by Tomoyuki Chikanaga.

Backport changed from 2.1: REQUIRED, 2.2: DONE, 2.3: REQUIRED to 2.1: REQUIRED, 2.2: DONE, 2.3: DONE

ruby_2_3 r57342 merged revision(s) 56469.

----------------------------------------
Bug #12860: Splatting an argument does not obey left-to-right execution order
https://bugs.ruby-lang.org/issues/12860#change-62500

* Author: Charles Nutter
* Status: Closed
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: 2.3.1
* Backport: 2.1: REQUIRED, 2.2: DONE, 2.3: DONE
----------------------------------------
Ruby evaluates arguments left to right, but it does not appear to handle construction of the eventual argument list from left to right.

Take this example:

```ruby
def foo(*args)
  p args
end

ary = [1,2]

foo(*ary, ary.shift)
```

With left-to-right execution, the `ary` value should be splatted (1, 2), and THEN shifted (1) producing `args == [1, 2, 1]`.

However, on MRI, the shift occurs *before* the splat, so `args == [2, 1]`.

This is counter-intuitive. At the moment in time the splat is encountered, `ary` is still `[1, 2]`. So the first two arguments should be (1, 2). THEN the shift happens, producing a third argument of (1).

This affects JRuby running Rails because they have a small piece of code that depends on this unusual behavior: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/callbacks.rb#L411-L425

This code appears to have been introduced into Rails recently, and I will file a separate issue to change it to be more explicit about ordering.



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