使用< =>的正确方法是什么? Ruby中的运算符?

时间:2018-03-05 18:00:12

标签: ruby range comparison operator-keyword

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

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

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

3 个答案:

答案 0 :(得分:1)

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

因此,您需要在正确的背景下使用它:

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

如果无法比较这两件事,你会得到nil。请注意,这与&#34;空字符串&#34;:

不同
1 <=> '1'
# => nil

这意味着&#34;无效的比较&#34;。 <=>运算符在这里很不错,因为在其他情况下会出现异常:

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>]

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

答案 1 :(得分: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)

会有所不同。

答案 2 :(得分:0)

将此片段添加到其他答案:&#34;太空船运营商&#34;返回-1,0或1,以便在比较.sort调用中的项目时使用它:

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

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

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