Pregunta

Dado el código Ruby

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

Lo comprendo todo en la segunda línea a excepción del operador * - ¿qué está haciendo y dónde está la documentación para esto? (Como se puede imaginar, la búsqueda de este caso está resultando difícil ...)

¿Fue útil?

Solución

El * es el splat operador.

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

Para ilustrar, las dos instrucciones siguientes son iguales:

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

También se puede utilizar en un contexto diferente, para atrapar todos los argumentos de los métodos restantes en una definición de método. En ese caso, no se expande, pero se combinan:

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

Parte de la información más detallada aquí .

Otros consejos

El operador splat desempaqueta una matriz pasa a una función de modo que cada elemento se envía 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 todo!

Como todos menciona, es un "splat". Buscando sintaxis Ruby es imposible, y le he pedido esto en otras preguntas. La respuesta a esa parte de la pregunta es que usted busca en

asterisk in ruby syntax

en Google. Google está a su disposición, sólo hay que poner lo que se ve en palabras.

Anyhoo, al igual que una gran cantidad de código Ruby, ese código es bastante denso. La

line.split(/=|;/)

hace una serie de seis elementos, first_name, mickey, last_name, mouse, country, usa. A continuación, el símbolo es usado para hacer eso en un hash. Ahora la gente de Ruby siempre mandan a que mire el método de Splat, ya que todo está expuesto en Ruby. No tengo idea de dónde se encuentra, pero una vez que tienes eso, se verá que se ejecuta un for través de la matriz y construye el hash.

Se podría buscar el código en el href="http://www.ruby-doc.org/core/" rel="nofollow noreferrer"> documentación núcleo

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 banda de Ruby será capaz de decirle qué su código es tonto, malo, o simplemente errónea.

Si usted ha leído hasta aquí, echar un rel leer a través de la documentación Hash para la inicialización.

Básicamente un hash que se inicia con varios argumentos los crea como pares de valores clave:

Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200}

Así que en su ejemplo que esto llevaría a la siguiente Hash:

{"first_name"=>"mickey", "last_name"=>"mouse", "county"=>"usa"}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top