Question

Qu'est-ce que l'opérateur Ruby < = = gt; (vaisseau spatial)? L’opérateur est-il implémenté par d’autres langues?

Était-ce utile?

La solution

Perl était probablement la première langue à l’utiliser. Groovy est un autre langage qui le prend en charge. Fondamentalement, au lieu de renvoyer 1 ( vrai ) ou 0 ( false ) selon que les arguments sont égaux ou non , l'opérateur du vaisseau spatial retournera 1 , 0 ou & # 8722; 1 en fonction de la valeur de l'argument de gauche par rapport à l'argument de droite .

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

C'est utile pour trier un tableau.

Autres conseils

La méthode du vaisseau spatial est utile lorsque vous la définissez dans votre propre classe et que vous incluez le module Comparable . Votre classe obtient alors le > ;, < , > =, < =, ==, et entre? méthodes gratuitement.

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

C'est un opérateur de comparaison général. Il renvoie -1, 0 ou +1, selon que son récepteur est inférieur, égal ou supérieur à son argument.

Je vais expliquer avec un exemple simple

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

    Ruby commencera à comparer chaque élément des deux tableaux du côté gauche. 1 pour le tableau de gauche est inférieur à 2 du tableau de droite. Par conséquent, le tableau de gauche est plus petit que le tableau de droite. La sortie sera -1 .

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

    Comme ci-dessus, il comparera d'abord le premier élément égal, puis le deuxième élément; dans ce cas, le deuxième élément du tableau de gauche est supérieur et la sortie est donc 1 .

Etant donné que cet opérateur réduit les comparaisons à une expression entière, il constitue le moyen le plus général de trier par ordre croissant ou décroissant en fonction de plusieurs colonnes / attributs.

Par exemple, si j’ai un tableau d’objets, je peux faire les choses suivantes:

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

Ce modèle de base peut être généralisé pour trier par un nombre quelconque de colonnes, quelle que soit la permutation ascendante / descendante de chacune.

  

Qu'est-ce que < = = gt; (l'opérateur 'Spaceship')

Selon la RFC qui a introduit l'opérateur , le code $ 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

Exemple:

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

PLUS:

// 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top