Вы, кажется, сбиваете с толку sort
и sort_by
sort
возвращает два объекта из коллекции в блок и ожидает, что вы вернете <=> подобное значение: -1,0 или 1 в зависимости от того, равны ли аргументы, по возрастанию или по убыванию, например
%w(one two three four five).sort {|a,b| a.length <=> b.length}
Сортирует строки по длине. Это форма для использования, если вы хотите использовать свой оператор <=>
sort_by
возвращает по одному объекту из коллекции за раз и ожидает, что вы вернете то, что вы хотите отсортировать, - вам не следует здесь сравнивать. Затем Ruby использует <=> в этих объектах для сортировки вашей коллекции. Предыдущий пример может быть переписан как
%w(one two three four five).sort_by {|s| s.length}
Это также известно как преобразование Шварца
В вашем случае коллекция представляет собой хэш, поэтому все немного сложнее: значения, которые передаются в блок, являются массивами, которые содержат пары ключ / значение, поэтому вам необходимо извлечь объект person из этой пары. Вы также можете просто работать с @ hash.keys или @ hash.values (в зависимости от того, являются ли объекты person ключами или значениями)