2013-11-30 6 views
0

Extending the geocoder gem, я пытаюсь поддержать версию Ruby 1.8.7, 1.9.2 и 1.9.3.Ошибка Ruby 1.8.7, используя sort_by

В 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.

В чем причина этой ошибки?

ответ

3

Ruby внутренне использует <=> для сравнения при сортировке.

Я думаю, что в блоке есть недоразумение для sort_by: вы получаете элемент массива как аргумент блока, а не ключ/значения хэшей. Таким образом, value всегда nil. И хотя в Ruby> = 1,9 nil <=> nil равен нулю, метода <=> нет на nil для Ruby 1.8.

Так что вы должны сделать, это sort_by вызов, например, что-то вроде этого:

hashes = [ 
    {"u33dc0cpnnf4j6c9vksk7zzp"=>1}, 
    {"u33ddph3wbe2cjnfnxe98sn0"=>1}, 
    {"u33616p4rb8vtm9uscy26f5b"=>1} 
] 

hashes.sort_by { |val| val.values.first } 

Эта сортировка по первому значению каждого хэша.

+0

Отлично, спасибо! – weltschmerz

Смежные вопросы