Splatting an argument does not obey left-to-right execution order
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.