h.sort_by {|k, v| [v, k] }
Используется тот факт, что Array
смешивается в Comparable
и определяет <=>
поэлементно.
Обратите внимание, что вышеприведенное эквивалентно
h.sort_by {|el| el.reverse }
что эквивалентно
h.sort_by(&:reverse)
, которое может быть или не быть более читабельным.
Если вы знаете , что Hash
обычно сначала сортируют по ключу, а затем поЗначение вышеизложенного должно быть очевидным.Может быть, с небольшим комментарием:
h.sort_by(&:reverse) # sort by value first, then by key
Примечание: если вы просто хотите делегировать методу <=>
какого-либо свойства (т.е. сортировать по ключу, а не функции общего сравнения), обычно этопредпочтительнее использовать sort_by
вместо sort
.Это намного легче читать.Как правило, это также происходит быстрее, но аспект читабельности является более важным.
Вы действительно должны написать свою собственную функцию сравнения, только если абсолютно необходимо.
Итак, ваш нерабочий пример лучше записать как
h.sort_by {|el| el[1] }
Лично я предпочитаю использовать деструктурирующую привязку в списке параметров блока вместо el[0]
и el[1]
:
h.sort_by {|key, value| value }
Однако, в данном конкретном случае, el[1]
также оказывается идентичным el.last
, так что вы можете просто написать
h.sort_by(&:last)