在Ruby中使用<=>运算符的正确方法是什么? [重复]

问题描述 投票:0回答:3

这个问题在这里已有答案:

我不太明白这是如何工作的。我想其中很大一部分原因是因为我已经习惯了C及其低级数据结构,并且在更高的抽象级别进行编程需要一些时间来习惯。无论如何,我正在阅读Ruby编程语言,我来到关于范围的部分,以及如何使用<=>运算符作为C语言的简写,你需要将它作为一系列if-else语句来实现。根据比较结果,它返回-101。我决定尝试以下声明:

range = 1..100
r = (100 <=> range)
print( r )

结果是一个空字符串。所以我的问题是,这个运算符是如何工作的;它返回什么数据类型(我假设返回值是整数类型,但我不能肯定地说);最后使用它的正确方法是什么?感谢您的时间,对不起,如果已经回答了(我没有在列表中看到它)。

ruby range comparison operator-keyword
3个回答
1
投票

<=>运算符用于比较可以直接比较的两个值,如字符串中的字符串或数字与数字。它不能神奇地比较两个不同的东西,Ruby不会为你转换。

因此,您需要在正确的上下文中使用它:

1 <=> 2
# => -1
2 <=> 1
# => 1
1 <=> 1
# => 0

当这两件事情无法比较时,你会得到nil。请注意,这与“空字符串”不同:

1 <=> '1'
# => nil

这意味着“无效比较”。 <=>运算符在这里很不错,因为在其他情况下你得到一个例外:

1 < '1'
# => ArgumentError: comparison of Integer with String failed

您也可以使用此运算符创建自己的Comparable兼容类:

class Ordered
  include Comparable

  attr_reader :sequence

  def initialize(sequence)
    @sequence = sequence
  end

  def <=>(other)
    self.sequence <=> other.sequence
  end
end

然后你可以这样做:

a = Ordered.new(10)
b = Ordered.new(2)

[ a, b ].sort
# => [#<Ordered:0x00007ff1c6822b60 @sequence=2>, #<Ordered:0x00007ff1c6822b88 @sequence=10>]

那些出来的顺序。 <=>实现处理这些是如何排序的,您可以根据排序规则的复杂程度对其进行精细处理。


0
投票

使用返回值-101仅作为描述不同状态的标签,您可以编写一个取决于两个数字之间顺序的条件:

case a <=> b
when -1 then # a is smaller than b. Do something accordingly
when 0 then # a equals b. Do something accordingly
when 1 then # a is larger than b. Do something accordingly
end

或者,你可以使用值-101的用例是你想要在不使用a方法的情况下获得两个数字babs之间的(非负)差异。下列:

(a - b) * (a <=> b)

会有所作为。


0
投票

添加到其他答案此片段:“太空飞船运营商”返回-1,0或1,因此您可以在比较.sort呼叫中的项目时使用它:

events.sort {|x, y| y.event_datetime <=> x.event_datetime}

0表示两个项目相同,1表示它们不同但排序顺序正确,-1表示它们不正常。上面的例子将xy反转为按降序排序。

在C中,函数strcmp()具有大致相同的行为,以适合qsort(),具有相同的语义。

© www.soinside.com 2019 - 2024. All rights reserved.