O que é o operador Ruby (nave espacial)?

O que é o operador Ruby (nave espacial)? O operador é implementado por outros idiomas?

   

Perl foi provavelmente a primeira língua a usá-lo. Groovy é outra linguagem que suporta isso. Basicamente, em vez de retornar 1 ( true ) ou 0 ( false ), dependendo de os argumentos serem iguais ou desiguais, o operador da espaçonave retornará 1 , 0 ou −1 dependendo do valor do argumento esquerdo relativo ao argumento correto.

 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 

É útil para classificar uma matriz.

O método da espaçonave é útil quando você o define em sua própria class e inclui o módulo Comparável . Sua class então recebe o >, < , >=, < =, ==, and between? methods de graça.

 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.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 # [#, #, #] 

É um operador de comparação geral. Ele retorna um -1, 0 ou +1, dependendo de seu receptor ser menor, igual ou maior que seu argumento.

Vou explicar com exemplo simples

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

    Ruby começará a comparar cada elemento de ambos os arranjos do lado esquerdo. 1 para a matriz esquerda é menor que 2 da matriz correta. Portanto, a matriz esquerda é menor que a matriz correta. A saída será -1 .

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

    Como acima, ele primeiro compara o primeiro elemento que é igual, então ele irá comparar o segundo elemento, neste caso, o segundo elemento do array esquerdo é maior, portanto, a saída é 1 .

Como esse operador reduz as comparações com uma expressão de número inteiro, ele fornece a maneira mais geral de sorting crescente ou decrescente com base em várias colunas / atributos.

Por exemplo, se eu tiver uma matriz de objects, posso fazer coisas assim:

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

Esse padrão básico pode ser generalizado para classificar por qualquer número de colunas, em qualquer permutação de ascendente / descendente em cada um.

O que é < => (o operador ‘Spaceship’)

De acordo com o RFC que introduziu o operador , $ 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 

Exemplo:

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

MAIS:

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