Bug #12860
closedSplatting an argument does not obey left-to-right execution order
Description
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:
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.