什么是Ruby〈=>(宇宙飞船)运算符?

gajydyqb  于 2022-12-12  发布在  Ruby
关注(0)|答案(6)|浏览(116)

什么是Ruby的<=>(宇宙飞船)运算符?该运算符是否由其他语言实现?

4nkexdtk

4nkexdtk1#

spaceship operator将返回10−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。

jhiyze9q

jhiyze9q2#

当你在你自己的类中定义飞船方法并包含Comparable module时,它是很有用的。你的类将免费获得>, < , >=, <=, ==, and between?方法。

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

z4bn682m3#

这是一个通用的比较运算符。它返回-1、0或+1,这取决于它的接收方是小于、等于还是大于它的参数。

balp4ylt

balp4ylt4#

我将用一个简单例子来解释

  1. [1,3,2] <=> [2,2,2]
    Ruby将从左手开始比较两个数组的每个元素。左侧数组的1小于右侧数组的2。因此左侧数组小于右侧数组。输出将为-1
  2. [2,3,2] <=> [2,2,2]
    如上所述,它将首先比较相等的第一元素,然后比较第二元素,在这种情况下,左阵列的第二元素较大,因此输出为1
42fyovps

42fyovps5#

由于此运算符将比较简化为整数表达式,因此它提供了最通用的方式来基于多个列/属性进行升序或降序排序。
例如,如果我有一个对象数组,我可以这样做:

# `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

这种基本模式可以推广为按任意数量的列排序,每个列可以按升序/降序进行任意排列。

bsxbgnwa

bsxbgnwa6#

什么是<=>(“太空船”操作员)

根据RFC that introduced the operator,$a <=> $B

第一个

范例:

//Comparing Integers

echo 1 <=> 1; //ouputs 0
echo 3 <=> 4; //outputs -1
echo 4 <=> 3; //outputs 1

//String Comparison

echo "x" <=> "x"; // 0
echo "x" <=> "y"; //-1
echo "y" <=> "x"; //1

详细信息:

// Integers
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1

// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1

echo "a" <=> "aa"; // -1
echo "zz" <=> "aa"; // 1

// Arrays
echo [] <=> []; // 0
echo [1, 2, 3] <=> [1, 2, 3]; // 0
echo [1, 2, 3] <=> []; // 1
echo [1, 2, 3] <=> [1, 2, 1]; // 1
echo [1, 2, 3] <=> [1, 2, 4]; // -1

// Objects
$a = (object) ["a" => "b"]; 
$b = (object) ["a" => "b"]; 
echo $a <=> $b; // 0

相关问题