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
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!