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