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

Ale*_*fee 12 ruby spaceship-operator

在" 是否可以根据单个对象对方法的响应来对对象列表进行排序? ",我发现飞碟对布尔值不起作用.

考虑:

Ruby 1.8.7:

[true, false].sort # => undefined method `<=>' for true:TrueClass (NoMethodError)
true <=> false     # => undefined method `<=>' for true:TrueClass (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

Ruby 1.9.3:

[true, false].sort # => comparison of TrueClass with false failed (ArgumentError)
true <=> false     # => nil
true <=> true      # => 0
false <=> true     # => nil
Run Code Online (Sandbox Code Playgroud)

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

这是一个错误sort吗?

mae*_*ics 12

布尔值没有自然顺序.

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

  • 这只是错误的决定.布尔代数基本上是一个格子,顶部和底部(真和假)绝对是*可比的. (2认同)

Pin*_*nyM 6

所谓的飞碟要求所有比较运算符(<>==)工作(不是技术上的,虽然理论上肯定)。 true并且false彼此之间不小于或大于。同样适用于nil。对于实际的解决方法,您可以“强制转换”为整数(0表示false,1表示true)。就像是:

[true, false, true].sort_by{|e| e ? 1 : 0}
Run Code Online (Sandbox Code Playgroud)

  • 作为设计问题,这很可能是因为人们无法真正猜测开发人员的意图。比较“ true&gt; false”时,您希望看到什么值?在某些语言中,false等于0,而true可能等于1或-1。设计人员可能认为应该由开发人员来决定这是一个任意决定。顺便说一句,PHP试图对此做一些事情,并且可能会使过程更加混乱。 (2认同)