O que é o <=>
operador Ruby (nave espacial)? O operador é implementado por outros idiomas?
ruby
operators
comparison-operators
spaceship-operator
Justin Ethier
fonte
fonte
[1,3,2] <=> [2,2,2]
?[1,nil] <=> [1,3]
você obtém umnil
por causa da consistência do algoritmo, compare cada elemento sucessivamente até que o<=>
resultado NÃO seja0
. Não há como o Ruby declarar menor ou maior do que neste exemplo, pois uma comparação simplesmente não pode ser feita. Onil
deve ser tratado como "não igual". Se você conhece alguma coisa sobre os dados e, por exemplo, deseja tratarnil
como0
, Ruby facilita isso.Respostas:
Perl foi provavelmente o primeiro idioma a usá-lo. Groovy é outro idioma que o suporta. Basicamente em vez de voltar
1
(true
) ou0
(false
), dependendo se os argumentos forem iguais ou diferentes, o operador nave espacial irá retornar1
,0
ou−1
, dependendo do valor do argumento relativo esquerdo para o argumento direita.É útil para classificar uma matriz.
fonte
O método da nave espacial é útil quando você o define em sua própria classe e inclui o módulo Comparável . Sua classe obtém os
>, < , >=, <=, ==, and between?
métodos gratuitamente.fonte
É um operador de comparação geral. Ele retorna -1, 0 ou +1, dependendo de seu receptor ser menor que, igual a ou maior que seu argumento.
fonte
Vou explicar com um exemplo simples
[1,3,2] <=> [2,2,2]
Ruby começará a comparar cada elemento de ambas as matrizes do lado esquerdo.
1
para matriz esquerda é menor que a2
matriz direita. Portanto, a matriz esquerda é menor que a matriz direita. A saída será-1
.[2,3,2] <=> [2,2,2]
Como acima, ele primeiro comparará o primeiro elemento que é igual e, em seguida, o segundo elemento; nesse caso, o segundo elemento da matriz esquerda é maior, portanto a saída é
1
.fonte
Como esse operador reduz as comparações com uma expressão inteira, ele fornece a maneira mais geral de classificar crescente ou decrescente com base em várias colunas / atributos.
Por exemplo, se eu tenho uma matriz de objetos, posso fazer coisas assim:
Esse padrão básico pode ser generalizado para classificar por qualquer número de colunas, em qualquer permutação de ascensão / descida em cada uma.
fonte
De acordo com a RFC que introduziu a operadora , $ a
<=>
$ bExemplo:
MAIS:
fonte