Array#sort unexpected behaviour

Please explain why “a” is corrupted after call to Array#sort:

irb(main):044:0> a=[[1, “abc”],[3, “def”],[2, “efg”]]
=> [[1, “abc”], [3, “def”], [2, “efg”]]
irb(main):045:0> a.sort { |a, b| a[0] <=> b[0] }
=> [[1, “abc”], [2, “efg”], [3, “def”]]
irb(main):046:0> a
=> [1, “abc”]

A new sorted array is correctly returned, but “a” itself is not left
intact.
It seems to have something to do with me using an array-of-arrays.

/D

On Feb 11, 2008, at 10:47 AM, daniel åkerud wrote:

irb(main):044:0> a=[[1, “abc”],[3, “def”],[2, “efg”]]
=> [[1, “abc”], [3, “def”], [2, “efg”]]
irb(main):045:0> a.sort { |a, b| a[0] <=> b[0] }
=> [[1, “abc”], [2, “efg”], [3, “def”]]
irb(main):046:0> a
=> [1, “abc”]

A new sorted array is correctly returned, but “a” itself is not left
intact.
It seems to have something to do with me using an array-of-arrays.

Your block parameter is also called ‘a’.

In Ruby 1.9, this isn’t an issue, but in 1.8, the variable is the same
as the block parameter.

Dave