使用sort_by的Ruby 1.8.7错误

时间:2013-11-30 11:14:05

标签: ruby sorting

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

造成此错误的原因是什么?

1 个答案:

答案 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 }

按每个哈希的第一个值排序。