为什么不排序或太空飞船(飞碟)操作员()在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 

它可能与true和false有关,没有规范的排序顺序,因为它首先出现? 但是,这对我来说听起来很微弱。

这是一个sort错误吗?

布尔值没有自然顺序。

Ruby语言设计师可能认为发明一个布尔序列对开发人员来说是一个惊喜,所以他们故意忽略了比较运算符。

所谓的飞碟需要所有比较操作员( <>== )才能工作(技术上不是,但理论上确实如此)。 truefalse不小于或大于彼此。 nil 。 对于实际的解决方法,您可以“强制转换”为整数(0表示false,1表示true)。 就像是:

 [true, false, true].sort_by{|e| e ? 1 : 0} 

布尔没有自然的顺序。 与C不同,false不小于true,它们只是等效且同等有效的状态。 但是,可以使用块以任何方式配置排序,例如:

 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]