为什么我们需要宇宙飞船运营商?

时间:2015-06-10 23:13:47

标签: ruby

如果我们有<>==,则总订单由这些确定。我们为什么需要<=>

5 个答案:

答案 0 :(得分:1)

我们需要<=>

a<=>b

相当于:

if a<b
  return -1
elsif a>b 
  return 1
else
  return 0
end

为方便起见,它来自perl。

答案 1 :(得分:0)

<=>Comparable的基础,因此您不必自己实现所有比较功能。只需实现一个函数而不是三个函数,它更容易且更不容易出错。

答案 2 :(得分:-1)

“太空船”运营商用于比较,而非平等。它在概念上与C的strcmp函数类似。

来自String班级:

  

string <=> other_string→-1,0,+ 1或nil

     

比较 - 返回-1,0,+ 1或nil,具体取决于string是否小于,等于或大于other_string。

简而言之,==返回表示相等的布尔值,而<=>返回表示比较值的数字。如果第一个对象的值大于第二个对象,<=>将返回+1。如果它的值较小,则返回-1。如果两者具有相同的值,则返回0

对象的“值”可以定义为几乎任何东西。但是,对于String<=>会检查两个参数的lexicographic ordering

因此:

"abc" == "abc" # true
("abc" <=> "abc") == 0 # true

答案 3 :(得分:-1)

此运算符有时称为“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.我不知道更有效的方法来进行通用排序。

答案 4 :(得分:-1)

{J} {}},<==>之间存在冗余,这是正确的。实际上,当定义<=><==时,会自动定义>