在“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
中的错误吗?
答案 0 :(得分:12)
Ruby语言设计师可能认为发明一个布尔序列对开发人员来说是一个惊喜,所以他们故意忽略了比较运算符。
答案 1 :(得分:4)
所谓的飞碟需要所有比较操作员(<
,>
,==
)才能工作(不是技术上的,尽管理论上确实如此)。 true
和false
不小于或大于彼此。同样适用于nil
。对于实际的解决方法,您可以“强制转换”为整数(0表示false,1表示true)。类似的东西:
[true, false, true].sort_by{|e| e ? 1 : 0}
答案 2 :(得分:1)
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]