数组排序的Nil类错误

问题描述

| 当我尝试缩短数组时,出现如下错误
in `sort_by\': undefined method `<=>\' for nil:NilClass (NoMethodError)
@@secarr=@@secarr.sort_by{ |hotelname,location,cuisine,price| hotelname }
请解释一下,因为我是红宝石的新手。     

解决方法

您的代码是正确的,因为在
@@secarr
中的元素之间正在比较
hotelname
。您遇到的错误消息表示
hotelname
(有时)是
nil
,无法进行比较。比较只能在包含“ 5”模块的类上进行。解决方法是,假设
hotelname
通常是字符串,在
hotelname
之后放置
to_s
@@secarr = @@secarr.sort_by{|hotelname,location,cuisine,price| hotelname.to_s}
    ,尝试这个! 期望您的数组如下所示。
@secarr = [\"hotelname\",\"location\",\"cuisine\",\"price\"]
升序
@@secarr=@@secarr.compact.sort_by{ |secarr1,secarr2| secarr1 <=> secarr2 }
对于下降
@@secarr=@@secarr.compact.sort_by{ |secarr1,secarr2| secarr2 <=> secarr1 }
    ,编辑:我没有意识到
sort_by
可以在多维数组的块中接受多个参数。感谢萨瓦和开尔文的评论。 但是,如果数组不是数组的数组(例如,如果它是字符串的数组,且字段之间用
\\t
分隔),则将
sort_by
与多个参数一起使用将不起作用;它将引发您提到的错误。 如果您的案例是一个字符串数组,其中各字段之间用ѭ14分隔(就像您输入删除的答案一样),而hotelname是第一个字段,则必须执行以下操作:
@@secarr = @@secarr.sort_by { |el| el.split(/\\t+/)[0] }