ternario potencia operador ruby operators splat

potencia - ¿Qué hace el operador(unario)*en este código de Ruby?



operador ternario ruby (3)

Dado el código de Ruby

line = "first_name=mickey;last_name=mouse;country=usa" record = Hash[*line.split(/=|;/)]

Entiendo todo en la segunda línea, aparte del * operador: ¿qué está haciendo y dónde está la documentación para esto? (como se puede adivinar, la búsqueda de este caso está resultando difícil ...)


Como todos mencionan, es un "splat". Buscar la sintaxis de Ruby es imposible, y lo he preguntado en otras preguntas. La respuesta a esa parte de la pregunta es que usted busca en

asterisk in ruby syntax

en Google. Google está ahí para ti, simplemente pon lo que ves en palabras.

Anyhoo, como un montón de código de Ruby, ese código es bastante denso. los

line.split(/=|;/)

first_name, mickey, last_name, mouse, country, usa una matriz de seis elementos, first_name, mickey, last_name, mouse, country, usa . Luego, el splat se usa para convertirlo en Hash. Ahora la gente de Ruby siempre te envía a mirar el método Splat, ya que todo está expuesto en Ruby. No tengo idea de dónde está, pero una vez que tengas eso, verás que funciona for través de la matriz y crea el hash.

Buscaría el código en la documentación core . Si no puede encontrarlo (no pude), trataría de escribir un código como este (que funciona, pero NO es un código Ruby):

line = "first_name=mickey;last_name=mouse;country=usa" presplat = line.split(/=|;/) splat = Hash.new for i in (0..presplat.length-1) splat[presplat[i]] = presplat[i+1] if i%2==0 end puts splat["first_name"]

y luego la pandilla de Ruby podrá decirle por qué su código es tonto, malo o simplemente erróneo.

Si ha leído hasta aquí, lea la documentación Hash , que no explica el significado, pero sí necesita saberlo.


El * es el operador de splat .

Se expande una Array en una lista de argumentos, en este caso una lista de argumentos para el método Hash.[] . (Para ser más precisos, expande cualquier objeto que responda to_ary / to_a , o to_a en Ruby 1.9.)

Para ilustrar, las siguientes dos afirmaciones son iguales:

method arg1, arg2, arg3 method *[arg1, arg2, arg3]

También se puede usar en un contexto diferente para capturar todos los argumentos de método restantes en una definición de método. En ese caso, no se expande, sino que combina:

def method2(*args) # args will hold Array of all arguments end

Alguna información más detallada aquí .


El operador splat desempaqueta una matriz pasada a una función para que cada elemento se envíe a la función como un parámetro individual.

Un simple ejemplo:

>> def func(a, b, c) >> puts a, b, c >> end => nil >> func(1, 2, 3) #we can call func with three parameters 1 2 3 => nil >> list = [1, 2, 3] => [1, 2, 3] >> func(list) #We CAN''T call func with an array, even though it has three objects ArgumentError: wrong number of arguments (1 for 3) from (irb):12:in ''func'' from (irb):12 >> func(*list) #But we CAN call func with an unpacked array. 1 2 3 => nil

¡Eso es!