On 4/21/07, Larme <lalalarme / gmail.com> wrote: > Dear all, I'm a newbie to ruby and today when I'm writing a simple > script to process some data, I found something I can't understand. > > The data is stored in several column seperated by tab or space. I use > the following code to get the data (assuming the data comes from > standard input and all numbers are integer) > > data=[] > counter = 0 > while line = STDIN.gets > data[counter] = line.split > data[counter].map! {|str| str.to_i} > counter += 1 > end > > hence data[i] is an array hold all the numbers in the ith line, data[i] > [j] is the number on ith line and jth column. Then what I want the > script to do is sorting lines according to a specified column. I > thought the following code should work: > > result = data.sort {|x, y| x[col] <=> y[col] } > > where the col determine which column the script will sort according > to. However ruby raise a error saying: > "undefined method `<=>' for nil:NilClass (NoMethodError) > from ana.rb:16:in `sort' > from ana.rb:16 > " > > I have to write the code as > > result = data.sort {|x, y| x[col].to_i <=> y[col].to_i } > > to let the script run properly. I'm quite confused here. I think the > elements of array data are converted to integer when the code > > data[counter].map! {|str| str.to_i} > > finished. However why ruby still requires a explicit conversion when I > use the data.sort? > Yes, they are. You might be doing some typo or other crap. Following program runs verbatim: data=[] counter = 0 while line = STDIN.gets data[counter] = line.split data[counter].map! {|str| str.to_i} counter += 1 end #p data.sort_by { |x| x[2] } #=> you can use sort_by as an alternative p data.sort {|x,y| x[2] <=> y[2] } #=> This also work.