2011-08-30 19 views

Respuesta

11

El a y b representan un par de artículos. Podría ser cualquier dos tomado de su lista original. El <=> generalmente se llama el operador de nave espacial. Devuelve 0 si los dos elementos son iguales, -1 si el de la izquierda es más pequeño y 1 si el de la derecha es más pequeño.

Hay más información sobre the spaceship operator in the Ruby API docs. Ese es el documento para el de Fixnum, ya que eso es lo que estaba en su ejemplo, pero también puede consultar la definición de Float, String, etc. allí.

Actualizado: La función sort espera que el bloque tenga el mismo comportamiento que el operador de nave espacial. Si el primer argumento, a se debe ordenar primero, se debe devolver -1; si el segundo argumento, b se debe ordenar primero, se debe devolver 1; y así. Entonces en el ejemplo de list.sort { |a,b| a + b } está ordenando que el segundo argumento es más grande cada vez, ya que a + b es mayor que 1 por cada combinación posible en esa lista. Entonces, lo que estás viendo cuando obtienes [5,3,1,4,2] es básicamente un artefacto del orden en que los elementos pasan al bloque y es probable que no sean estables en todas las implementaciones de Ruby.

+3

¿Normalmente? La primera vez que lo escucho llamar "operador de nave espacial": P – Mchl

+2

Consulte http://en.wikipedia.org/wiki/Spaceship_operator y también el enlace "posible duplicado" en el comentario de Ryan sobre la pregunta. – Emily

+1

Sí, creo que se llama así. Solo me sorprende que no lo haya encontrado antes;) – Mchl

3

voy a responder a su pregunta al revés:

<=> es operador de comparación combinada de Ruby, y se puede utilizar como taquigrafía para determinar cuál de las dos variables es mayor. En su ejemplo, si b es mayor que volverá 1, si a es igual a b devolverá 0, y si a es mayor que volverá -1.

Dado que, list.sort permite la inclusión de un block - es decir, una pieza arbitraria de código que reemplazará algún comportamiento predeterminado de la función.

Esto es lo que se ve entre las llaves: { |a,b| b <=> a } es una función, y a y b son dos elementos de la lista que se comparan. Hace esto usando el cuerpo de la función, b <=> a, y en este caso, ordena la lista en orden descendente y no ascendente.

De esta manera, puede tener diferentes formas de clasificar elementos de una lista sin necesidad de reescribir toda la función de clasificación; solo debe proporcionar la sección que determina cuál de los dos elementos de la lista va primero.

-1

{| a, b | a < => b} se puede pensar en "ordenar a, antes de b" si "a < = b" ascendente {| b, a | a < => b} se puede pensar en "ordenar b, antes de" si "a < = b" descendente

Cuestiones relacionadas