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语言设计师可能觉得发明一个布尔序列对开发人员来说是一个惊喜,所以他们故意忽略了比较运算符.
所谓的飞碟要求所有比较运算符(<,>,==)工作(不是技术上的,虽然理论上肯定)。 true并且false彼此之间不小于或大于。同样适用于nil。对于实际的解决方法,您可以“强制转换”为整数(0表示false,1表示true)。就像是:
[true, false, true].sort_by{|e| e ? 1 : 0}
Run Code Online (Sandbox Code Playgroud)