为什么不排序或宇宙飞船(飞碟)操作员(< =>)在Ruby中使用布尔值?

时间:2013-02-11 16:13:43

标签: ruby spaceship-operator

在“Is it possible to sort a list of objects depending on if the individual object's response to a method?”中,我发现飞碟不适用于布尔值。

考虑:

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中的错误吗?

3 个答案:

答案 0 :(得分:12)

布尔值没有自然排序。

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

布尔人没有自然的顺序。与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]