我不太明白这是如何运作的。我想其中很大一部分原因是因为我已经习惯了C及其低级数据结构,并且在更高的抽象级别进行编程需要一些时间来习惯。无论如何,我正在阅读 The Ruby Programming Language ,我来到关于范围的部分,以及如何使用<=>
运算符作为C语言的简写,你将需要实现为if-else
语句的序列。它会返回-1
,0
或1
,具体取决于比较结果。我决定尝试以下声明:
range = 1..100
r = (100 <=> range)
print( r )
结果是一个空字符串。所以我的问题是,这个运算符是如何工作的;它返回什么数据类型(我假设返回值是整数类型,但我不能肯定地说);最后使用它的正确方法是什么?感谢您的时间,如果已经回答,我很抱歉(我在列表中没有看到它)。
答案 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)
仅将返回值-1
,0
和1
用作描述不同状态的标签,您可以编写一个取决于两个数字之间顺序的条件:
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
或者,您可以使用值-1
,0
和1
的用例是您希望获得两者之间的(非负)差异不使用a
方法的数字b
和abs
。以下内容:
(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表示它们不正常。上面的示例将x
和y
反转为按降序排列。
在C中,函数strcmp()
具有大致相同的行为,以适合qsort()
,具有相同的语义。