Sorry, I realized there's no call for action here. Can we get an official ruling that the 1.9 evaluation order is the "correct" one, and consider the 1.8 behavior to be a quirky implementation artifact? Charles Oliver Nutter wrote: > I was writing up some specs for evaluation order today and discovered > something rather interesting: > > before :each do > @obj = Object.new > def @obj.foo(a, b, &c) > [a, b, c ? c.call : nil] > end > end > > it "evaluates block pass before arguments" do > a = 0 > p = proc {true} > @obj.foo(a += 1, a += 1, &(a += 1; p)).should == [2, 3, true] > a.should == 3 > end > > it "evaluates block pass before receiver" do > p1 = proc {true} > p2 = proc {false} > p1.should_not == p2 > > p = p1 > (p = p2; @obj).foo(1, 1, &p).should == [1, 1, true] > end > > This was unexpected for me. Argument order being left-to-right seems > reasonable, and I think it's what most people would expect looking at > the code. But having the block pass argument evaluated not only before > the other args but before the receiver seems broken. > > Unlike Ruby 1.8, Ruby 1.9 and JRuby behave the same, with the order > being exactly what you'd expect: > > CODE > obj = Object.new > def obj.foo(a, b, &c) > [a, b, c ? c.call : nil] > end > pr = proc {3} > p ((p 'a'; obj).foo((p 'b'; 1), (p 'c'; 2), &(p 'd'; pr)))" > Ruby 1.8: > "d" > "a" > "b" > "c" > [1, 2, 3] > > Ruby 1.9: > "a" > "b" > "c" > "d" > [1, 2, 3] > > JRuby: > "a" > "b" > "c" > "d" > [1, 2, 3] > > Rubinius still evaluates arguments in reverse order, and then evaluates > block pass after the arguments but before the receiver. I believe this > is being "fixed", but at the moment it's the most unexpected behavior of > the four: > > "c" > "b" > "d" > "a" > [1, 2, 3] > > - Charlie >