starred.sort_by { |a| [a ? 1 : 0, a] }
Когда нужно сравнить два элемента, он сравнивает массивы. Когда Ruby сравнивает массивы (вызывает метод ===
), он сравнивает 1-й элемент и переходит ко 2-м элементам, только если 1-й равен. ? 1 : 0
гарантирует, что Fixnum будет первым элементом, поэтому не должно быть ошибок.
Если вы сделаете ? 0 : 1
, nil
появится в конце массива вместо начала.
Вот пример:
irb> [2, 5, 1, nil, 7, 3, nil, nil, 4, 6].sort_by { |i| [i ? 1 : 0, i] }
=> [nil, nil, nil, 1, 2, 3, 4, 5, 6, 7]
irb> [2, 5, 1, nil, 7, 3, nil, nil, 4, 6].sort_by { |i| [i ? 0 : 1, i] }
=> [1, 2, 3, 4, 5, 6, 7, nil, nil, nil]