如果我们有<
、>
和==
,则总顺序由它们决定。为什么我们需要<=>
?
我们不需要<=>
.
a<=>b
相当于:
if a<b
return -1
elsif a>b
return 1
else
return 0
end
它是为了方便而存在的,它是从perl中获取的。
<=>
是Comparable的基础,因此您不必自己实现所有比较函数。只实现一个函数而不是三个函数更容易且更不容易出错。
"宇宙飞船"运算符用于比较,而不是相等。它在概念上类似于 C 的 strcmp
函数。
从String
类:
无
string <=> other_string
→ -1、0、+1 或比较 — 返回 -1、0、+1 或 nil,具体取决于字符串是小于、等于还是大于 other_string。
简而言之,==
返回一个表示相等的布尔值,而<=>
返回一个表示比较值的数字。如果第一个对象比第二个对象具有更大的值,则<=>
返回+1
。如果它的价值较低,则返回-1
。如果两者具有相同的值,则返回0
。
对象的"值"可以定义为几乎任何东西。然而,对于String
,<=>
检查两个参数的词典顺序。
因此:
"abc" == "abc" # true
("abc" <=> "abc") == 0 # true
你是对的,<
、==
、>
和<=>
之间存在冗余。事实上,当定义<
、==
、>
时,<=>
是自动定义的。
此运算符有时称为"signum"函数。它提供了自定义排序顺序的最简洁方法。例如:
require "ostruct"
# Fake "rows" with OpenStructs
my_data = [
OpenStruct.new({ :name => "Ben", :age => 50 }),
OpenStruct.new({ :name => "Abe", :age => 50 }),
OpenStruct.new({ :name => "Cab", :age => 51 })
]
# Sort by age descending, then name ascending
puts my_data.sort { |a, b| 2 * (b.age <=> a.age) + (a.name <=> b.name) }
这是因为 <=>
中的值始终为 -1、0 或 1。我不知道更有效的方法来进行通用排序。