Czym jest operator Ruby < = > (statek kosmiczny)?

Czym jest operator Ruby <=> (statek kosmiczny)? Czy operator jest zaimplementowany w innych językach?

Author: Andrew Marshall, 2009-05-06

6 answers

Perl był prawdopodobnie pierwszym językiem, który go używał. Groovy to kolejny język, który go obsługuje. Zasadniczo zamiast zwracać 1 (true) lub 0 (false) w zależności od tego, czy argumenty są równe czy nierówne, operator statku kosmicznego zwróci 1, 0, lub −1 w zależności od wartości lewego argumentu względem prawego argumentu.

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

Jest to przydatne do sortowania tablicy.

 288
Author: TonyArra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-15 14:46:58

Metoda spaceship jest przydatna, gdy zdefiniujesz ją we własnej klasie i dołączysz porównywalny Moduł . Twoja klasa otrzymuje metody >, < , >=, <=, ==, and between? za darmo.

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>]
 57
Author: steenslag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-15 21:43:55

To ogólny operator porównawczy. Zwraca albo A -1, 0 lub +1 w zależności od tego, czy odbiornik jest mniejszy, równy lub większy od jego argumentu.

 19
Author: gnovice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-06 01:31:08

Wyjaśnię prostym przykładem

  1. [1,3,2] <=> [2,2,2]

    Ruby zacznie porównywać każdy element tablicy z lewej strony. 1 dla lewej tablicy jest mniejszy niż {[2] } prawej tablicy. Stąd lewa tablica jest mniejsza od prawej. Wyjście to -1.

  2. [2,3,2] <=> [2,2,2]

    Jak wyżej najpierw porównaÄ ‡ pierwszy element, ktĂłry jest răłwny, potem porăłwna drugi element, w tym przypadku drugi element lewej tablicy jest wiÄ ™ kszy, wiÄ ™ c wynik jest 1.

 15
Author: Anil Maurya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-29 16:29:10

Ponieważ operator ten redukuje porównania do wyrażenia całkowitego, zapewnia najbardziej ogólny sposób sortowania rosnąco lub malejąco na podstawie wielu kolumn / atrybutów.

Na przykład, jeśli mam tablicę obiektów mogę zrobić takie rzeczy:

# `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
my_objects.sort! do |a, b|
      4 * (a.zip   <=> b.zip) +
     -3 * (a.age   <=> b.age) +
      2 * (a.last  <=> b.last) +
          (a.first <=> b.first)
end

Ten podstawowy wzorzec można uogólnić na sortowanie według dowolnej liczby kolumn, w dowolnej permutacji rosnącej/malejącej na każdej z nich.

 0
Author: lilole,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-11 23:49:37

Co to jest <=> ( operator statku kosmicznego)

Zgodnie z RFC, które wprowadziło operator , $a <=> $b

 -  0 if $a == $b
 - -1 if $a < $b
 -  1 if $a > $b

 - Return 0 if values on either side are equal
 - Return 1 if value on the left is greater
 - Return -1 if the value on the right is greater

Przykład:

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

Więcej:

// 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
 -1
Author: RïshïKêsh Kümar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-27 08:29:16