O que o operador (unário) * faz nesse código Ruby?

Dado o código Ruby

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

Eu entendo tudo na segunda linha além do operador * – o que está fazendo e onde está a documentação para isso? (como você pode imaginar, procurar por este caso está se mostrando difícil …)

O * é o operador de splat .

Ele expande um Array em uma lista de argumentos, neste caso, uma lista de argumentos para o método Hash.[] . (Para ser mais preciso, ele expande qualquer object que responda a to_ary / to_a , ou to_a no Ruby 1.9.)

Para ilustrar, as duas declarações a seguir são iguais:

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

Ele também pode ser usado em um contexto diferente, para capturar todos os argumentos de método restantes em uma definição de método. Nesse caso, não se expande, mas combina:

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

Algumas informações mais detalhadas aqui .

O operador splat descompacta um array passado para uma function de forma que cada elemento seja enviado para a function como um parâmetro individual.

Um exemplo simples:

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

É isso aí!

Como todos mencionam, é um “splat”. Procurando pela syntax do Ruby é impossível, e eu perguntei isso em outras perguntas. A resposta a essa parte da pergunta é que você pesquisa

 asterisk in ruby syntax 

no Google. Google está lá para você, basta colocar o que você vê em palavras.

Anyhoo, como um monte de código Ruby, esse código é bastante denso. o

 line.split(/=|;/) 

faz uma matriz de elementos SIX, first_name, mickey, last_name, mouse, country, usa . Então o splat é usado para fazer isso em um Hash. Agora o pessoal do Ruby sempre manda você olhar o método Splat, já que tudo está exposto no Ruby. Eu não tenho idéia de onde é, mas uma vez que você tem isso, você verá que ele é executado através de uma matriz e constrói o hash.

Você procuraria o código na documentação principal . Se você não pode encontrá-lo (eu não poderia), você tentaria escrever algum código como este (que funciona, mas não é código parecido com 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"] 

e então a turma Ruby poderá lhe dizer por que seu código é bobo, ruim ou simplesmente errado.

Se você leu até aqui, leia a documentação do Hash , que não explica o splat, mas você precisa saber disso.