数组排序的Nil类错误

时间:2011-04-14 10:33:47

标签: ruby

当我试图缩短数组时,我收到如下错误:

in `sort_by': undefined method `<=>' for nil:NilClass (NoMethodError)
@@secarr=@@secarr.sort_by{ |hotelname, location, cuisine, price| hotelname }

请解释,因为我是红宝石的新手。

3 个答案:

答案 0 :(得分:1)

您的代码是正确的,hotelname正在@@secarr中的元素进行比较。您遇到的错误消息表示hotelname(有时)nil,无法进行比较。只能在包含Enumerable模块的类上进行比较。解决方案是假设hotelname通常是一个字符串,将to_s放在hotelname之后。

@@secarr = @@secarr.sort_by{|hotelname, location, cuisine, price| hotelname.to_s}

答案 1 :(得分:0)

试试这个!

期待您的阵列看起来像这样。

@secarr = ["hotelname", "location", "cuisine", "price"]

升序

@@secarr=@@secarr.compact.sort_by{ |secarr1,secarr2| secarr1 <=> secarr2 }

降序

@@secarr=@@secarr.compact.sort_by{ |secarr1,secarr2| secarr2 <=> secarr1 }

答案 2 :(得分:-1)

编辑:我没有意识到sort_by可以在块中为多维数组接受多个参数。感谢sawa和Kelvin的评论。

但是,如果数组不是数组数组(例如,如果它是字符串数组,其中字段由\t分隔),则使用sort_by不止一个论点不起作用;它会引起你提到的错误。

如果您的案例是一个字符串数组,其中字段以\t分隔(当您输入已删除的答案时),并且hotelname是第一个字段,则必须执行以下操作:

@@secarr = @@secarr.sort_by { |el| el.split(/\t+/)[0] }