为什么我们需要宇宙飞船操作员



如果我们有<>==,则总顺序由它们决定。为什么我们需要<=>

我们不需要<=> .

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。我不知道更有效的方法来进行通用排序。

最新更新