From: "Jesús Gabriel y Galán" Date: 2009-12-06T06:24:29+09:00 Subject: Re: different output for same expression? On Sat, Dec 5, 2009 at 6:43 PM, Paul Smith wrote: > 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. This is not correct. puts returns nil: irb(main):004:0> myarray = ["210", "22"] => ["210", "22"] irb(main):005:0> puts myarray 210 22 => nil > 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. This is not correct. What you are getting is: puts (myarray.sort) do ... and you are outputting the array in alphanumerical order of its string contents. The block is passed to the puts method, and silently ignored. > However, puts myarray.sort { ... will work the way you want, because { > has higher precedence than do. This works too if you want to keep the do...end: irb(main):010:0> puts(myarray.sort do |a,b| irb(main):011:2* a.to_i <=> b.to_i irb(main):012:2> end) 22 210 => nil Jesus.