Ruby <=>(太空船)操作符是什么?运算符是否由其他语言实现?
当前回答
这是一个一般的比较算子。它返回-1、0或+1,这取决于它的接收者是否小于、等于或大于它的参数。
其他回答
我将用一个简单的例子来解释
[1,3,2] <=> [2,2,2] Ruby将从左边开始比较两个数组的每个元素。 左数组的1小于右数组的2。因此左数组比右数组小。输出将是-1。 [2,3,2] <=> [2,2,2] 如上所述,它将首先比较第一个相等的元素,然后比较第二个元素,在这种情况下,左数组的第二个元素更大,因此输出为1。
飞船方法在您自己的类中定义并包含Comparable模块时非常有用。你的类然后得到>,<,>=,<=,==,和之间?方法。
class Card
include Comparable
attr_reader :value
def initialize(value)
@value = value
end
def <=> (other) #1 if self>other; 0 if self==other; -1 if self<other
self.value <=> other.value
end
end
a = Card.new(7)
b = Card.new(10)
c = Card.new(8)
puts a > b # false
puts c.between?(a,b) # true
# Array#sort uses <=> :
p [a,b,c].sort # [#<Card:0x0000000242d298 @value=7>, #<Card:0x0000000242d248 @value=8>, #<Card:0x0000000242d270 @value=10>]
这是一个一般的比较算子。它返回-1、0或+1,这取决于它的接收者是否小于、等于或大于它的参数。
飞船操作符将返回1、0或−1,这取决于左参数相对于右参数的值。
a <=> b :=
if a < b then return -1
if a = b then return 0
if a > b then return 1
if a and b are not comparable then return nil
它通常用于对数据进行排序。
它也被称为三向比较运算符。Perl可能是第一个使用它的语言。其他一些支持它的语言有Apache Groovy、PHP 7+和c++ 20。
由于此运算符减少了与整数表达式的比较,因此它提供了基于多列/属性的升序或降序排序的最通用方法。
例如,如果我有一个对象数组,我可以这样做:
# `sort!` modifies array in place, avoids duplicating if it's large...
# Sort by zip code, ascending
my_objects.sort! { |a, b| a.zip <=> b.zip }
# Sort by zip code, descending
my_objects.sort! { |a, b| b.zip <=> a.zip }
# ...same as...
my_objects.sort! { |a, b| -1 * (a.zip <=> b.zip) }
# Sort by last name, then first
my_objects.sort! { |a, b| 2 * (a.last <=> b.last) + (a.first <=> b.first) }
# Sort by zip, then age descending, then last name, then first
# [Notice powers of 2 make it work for > 2 columns.]
my_objects.sort! do |a, b|
8 * (a.zip <=> b.zip) +
-4 * (a.age <=> b.age) +
2 * (a.last <=> b.last) +
(a.first <=> b.first)
end
这个基本模式可以推广为按任意数量的列进行排序,每列的升序/降序排列是任意的。