From: Paul Smith Date: 2009-12-06T02:43:26+09:00 Subject: Re: different output for same expression? On Sat, Dec 5, 2009 at 5:14 PM, Steven Arnold wrote: > Forgive me if this is an elementary question and I am missing something obvious, but there is a behavior in Ruby that puzzles me a lot. > > I don't see why the two blocks below do not produce the same output.  One displays the numerically sorted array and the other does not. > > # Block 1 > myarray = ["210", "22"] > myarray = myarray.sort do |a,b| >    a.to_i <=> b.to_i > end > puts myarray > > # Block 2 > myarray = ["210", "22"] > puts myarray.sort do |a,b| >    a.to_i <=> b.to_i > end > > In one case, I reassign myarray to the return value of the sort method for myarray and then print myarray.  In the other case, I just directly print the return value of the sort method.  Shouldn't the return value be the same in both cases, and therefore the output also the same? Precedence. Note that "puts myarray" returns myarray. There's an ambiguity in your code that's being resolved dur to precedence. Look at the following: (puts myarray).sort do ... puts (myarray.sort do ... ) You're expecting the second, but you're getting the first. However, puts myarray.sort { ... will work the way you want, because { has higher precedence than do. > > Here is the same thing in the irb interface: > > > irb(main):001:0> myarray = ["210", "22"] > => ["210", "22"] > irb(main):002:0> myarray = myarray.sort do |a,b| > irb(main):003:1*     a.to_i <=> b.to_i > irb(main):004:1> end > => ["22", "210"] > irb(main):005:0> puts myarray > 22 > 210 > => nil > irb(main):006:0> myarray = ["210", "22"] > => ["210", "22"] > irb(main):007:0> puts myarray.sort do |a,b| > irb(main):008:1*     a.to_i <=> b.to_i > irb(main):009:1> end > 210 > 22 > => nil > > > steven > -- Paul Smith http://www.nomadicfun.co.uk paul@pollyandpaul.co.uk