Extending the geocoder gem,我试图支持Ruby版本1.8.7,1.9.2和1.9.3。
在1.9.2和1.9.3中,一切正常,但在1.8.7中,当我尝试运行时:
hashes.sort_by{ |key, value| value }
它给了我
NoMethodError: undefined method `<=>' for nil:NilClass
我的hashes
数组如下所示:
[
{"u33dc0cpnnf4j6c9vksk7zzp"=>1},
{"u33ddph3wbe2cjnfnxe98sn0"=>1},
{"u33616p4rb8vtm9uscy26f5b"=>1}
]
查看docs,它似乎不会在<=>
的源代码中的任何位置使用sort_by
。
造成此错误的原因是什么?
答案 0 :(得分:3)
Ruby内部使用<=>
进行排序时进行比较。
我认为sort_by
的块中存在一个误解:你得到一个数组元素作为块参数,而不是哈希的键/值。因此value
始终为nil
。而在Ruby&gt; = 1.9 nil <=> nil
为零时,对于Ruby 1.8,<=>
上没有nil
方法。
所以你需要做的就是sort_by
调用,例如:
hashes = [
{"u33dc0cpnnf4j6c9vksk7zzp"=>1},
{"u33ddph3wbe2cjnfnxe98sn0"=>1},
{"u33616p4rb8vtm9uscy26f5b"=>1}
]
hashes.sort_by { |val| val.values.first }
按每个哈希的第一个值排序。