Ответ 1
Булевы значения не имеют естественного порядка.
Дизайнеры языка Ruby, вероятно, чувствовали, что придумывать порядок для булевых будет сюрпризом для разработчиков, поэтому они намеренно не учитывают операторов сравнения.
В "Возможно ли отсортировать список объектов в зависимости от ответа отдельного объекта на метод?", я обнаружил, что летающая тарелка не работать с булевыми.
Рассмотрим:
Ruby 1.8.7:
[true, false].sort # => undefined method `<=>' for true:TrueClass (NoMethodError)
true <=> false # => undefined method `<=>' for true:TrueClass (NoMethodError)
Ruby 1.9.3:
[true, false].sort # => comparison of TrueClass with false failed (ArgumentError)
true <=> false # => nil
true <=> true # => 0
false <=> true # => nil
Возможно, это связано с истинным и ложным, не имеющим канонического порядка сортировки, потому что это на первом месте? Но это звучит довольно слабо для меня.
Является ли это ошибкой в sort
?
Дизайнеры языка Ruby, вероятно, чувствовали, что придумывать порядок для булевых будет сюрпризом для разработчиков, поэтому они намеренно не учитывают операторов сравнения.
Так называемая летающая тарелка требует, чтобы все операторы сравнения (<
, >
, ==
) работали (не технически, хотя, конечно, теоретически). true
и false
не меньше или больше друг друга. То же самое верно для nil
. Для практического обходного пути вы можете "отличать" целые числа (0 для false, 1 для true). Что-то вроде:
[true, false, true].sort_by{|e| e ? 1 : 0}
Булевы не имеют естественного упорядочения. В отличие от C, false не меньше истины, они являются эквивалентными и равноправными состояниями. Однако можно настроить сортировку любым способом, например, с помощью блока:
ary = [true, false, false, true]
ary.sort {|a,b| a == b ? 0 : a ? 1 : -1 }
# => [false, false, true true]
Реверсирование порядка также тривиально:
ary.sort {|a,b| a == b ? 0 : a ? -1 : 1 }
# => [true true, false, false]