2012-06-13 38 views
5

Soy nuevo en el Lenguaje Ruby por lo que cuando yo estaba tratando de resolver un hash por valor He utilizado este método para ordenar:lo que es la media de * y aplanar en rubí

movie_popularity.sort_by{|m,p| p}.reverse 

pero el método de la clase devuelve una matriz, mientras que necesito un hash a ser devuelto, así que utiliza este comando:

movie_popularity=Hash[*movie_popularity.sort_by{|m,p| p}.reverse.flatten] 

mi pregunta es ¿cuál es el significado de * y flatten en la línea de arriba?

Gracias =)

Respuesta

10

El * se llama el "operador splat"; No estoy seguro de poder darle la definición técnica (aunque estoy seguro de que lo encontraría lo suficientemente pronto con la ayuda de Google), pero la forma en que lo describiría es que básicamente toma el lugar de la escritura a mano múltiple valores separados por comas en el código.

Para hacer esto más concreto, considere el caso de Hash[] que ha utilizado en su ejemplo. La clase tiene un método Hash[] clase que toma un número variable de argumentos y, normalmente, se puede llamar así:

# Returns { "foo" => 1, "bar" => 2 } 
h = Hash["foo", 1, "bar", 2] 

Note como que no es un array o un hash o cualquier cosa que pasé en; es una secuencia de valores (escritos a mano). El operador * le permite lograr básicamente lo mismo utilizando una matriz; en su caso, la devuelta por movie_popularity.sort_by{|m,p| p}.reverse.flatten.

cuanto a que flatten llamada: cuando se llama sort_by en un hash, en realidad está aprovechando el módulo Enumerable que se incluye en una variedad de clases (más notablemente Array y Hash) que proporcionan enumeración. En el caso de un hash, te habrás dado cuenta de que en lugar de la iteración en uno como este:

hash.each { |value| ... } 

En lugar de hacer esto:

hash.each { |key, value| ... } 

Es decir, interactuando sobre una rendimientos de hash dos valores en cada iteración. Por lo que su llamada sort_by por sí misma devolvería una secuencia de pares. Llamar al flatten en este resultado colapsa los pares en una secuencia unidimensional de valores, como este:

# Returns [1, 2, 3, 4] 
[[1, 2], [3, 4]].flatten 
Cuestiones relacionadas