¿Qué es el <=>
operador Ruby (nave espacial)? ¿El operador está implementado por otros idiomas?
ruby
operators
comparison-operators
spaceship-operator
Justin Ethier
fuente
fuente
[1,3,2] <=> [2,2,2]
?[1,nil] <=> [1,3]
que obtiene,nil
debido a la coherencia del algoritmo, compare cada elemento por turnos hasta que el<=>
resultado NO sea0
. No hay forma de que Ruby declare menor o mayor que en este ejemplo, ya que simplemente no se puede hacer una comparación. Elnil
debe ser tratado como "no igual". Si usted sabe algo acerca de los datos, por ejemplo, y quiere tratarnil
como0
, Ruby hace tan fácil.Respuestas:
Perl fue probablemente el primer idioma en usarlo. Groovy es otro idioma que lo admite. Básicamente en lugar de regresar
1
(true
) o0
(false
) dependiendo de si los argumentos son iguales o desiguales, el operador de la nave espacial regresará1
,0
o−1
dependiendo del valor del argumento de la izquierda en relación con el argumento de la derecha.Es útil para ordenar una matriz.
fuente
El método de nave espacial es útil cuando lo define en su propia clase e incluye el módulo Comparable . Tu clase obtiene los
>, < , >=, <=, ==, and between?
métodos gratis.fuente
Es un operador de comparación general. Devuelve un -1, 0 o +1 dependiendo de si su receptor es menor, igual o mayor que su argumento.
fuente
Explicaré con un simple ejemplo
[1,3,2] <=> [2,2,2]
Ruby comenzará a comparar cada elemento de ambos conjuntos desde el lado izquierdo.
1
para la matriz izquierda es más pequeña que2
la matriz derecha. Por lo tanto, la matriz izquierda es más pequeña que la matriz derecha. La salida será-1
.[2,3,2] <=> [2,2,2]
Como arriba, primero comparará el primer elemento que es igual, luego comparará el segundo elemento, en este caso, el segundo elemento de la matriz izquierda es mayor, por lo tanto, la salida es
1
.fuente
Dado que este operador reduce las comparaciones a una expresión entera, proporciona la forma de propósito más general para ordenar ascendente o descendente en función de múltiples columnas / atributos.
Por ejemplo, si tengo una variedad de objetos, puedo hacer cosas como esta:
Este patrón básico se puede generalizar para ordenar por cualquier número de columnas, en cualquier permutación de ascendente / descendente en cada una.
fuente
Según el RFC que introdujo el operador , $ a
<=>
$ bEjemplo:
MÁS:
fuente