web-dev-qa-db-fra.com

Que fait l'opérateur (unaire) * dans ce code Ruby?

Étant donné le code Ruby

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

Je comprends tout dans la deuxième ligne à part le * _ opérateur - que fait-il et où se trouve la documentation à ce sujet? (comme vous pouvez le deviner, la recherche de cette affaire s'avère difficile ...)

165
David Burrows

Le * est l’opérateur splat .

Il étend un Array dans une liste d'arguments, dans ce cas une liste d'arguments au Hash.[] méthode. (Pour être plus précis, il développe tout objet qui répond à to_ary/to_a, ou to_a in Ruby 1.9.)

Pour illustrer, les deux déclarations suivantes sont égales:

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

Il peut également être utilisé dans un contexte différent pour intercepter tous les arguments de méthode restants dans une définition de méthode. Dans ce cas, il ne s'agrandit pas, mais combine:

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

Quelques informations plus détaillées ici .

256
molf

L'opérateur Splat décompresse un tableau transmis à une fonction afin que chaque élément soit envoyé à la fonction en tant que paramètre individuel.

Un exemple simple:

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

C'est ça!

41
BJ Homer

Comme tout le monde le mentionne, c'est un "splat". Rechercher la syntaxe Ruby est impossible, et je l’ai déjà demandé dans d’autres questions. La réponse à cette partie de la question est que vous effectuez une recherche sur

asterisk in Ruby syntax

dans Google. Google est là pour vous, mettez simplement ce que vous voyez en mots.

Anyhoo, comme beaucoup de code Ruby, ce code est assez dense. Le

line.split(/=|;/)

fait un tableau d'éléments SIX, first_name, mickey, last_name, mouse, country, usa. Ensuite, le splat est utilisé pour transformer cela en un hachage. Maintenant les Ruby les gens vous envoient toujours pour regarder la méthode Splat, puisque tout est exposé dans Ruby. Je ne sais pas du tout où il se trouve, mais une fois que vous avez cela, vous verrez qu'il lance un for dans le tableau et construit le hachage.

Vous chercheriez le code dans la documentation core . Si vous ne pouvez pas le trouver (je ne pourrais pas), essayez d’écrire du code comme celui-ci (qui fonctionne, mais n’est PAS du code semblable à 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"]

et ensuite la bande Ruby sera capable de vous dire pourquoi votre code est stupide, mauvais ou tout simplement faux.

Si vous avez lu jusqu'ici, parcourez la documentation Hash pour l'initialisation.

Fondamentalement, un hachage initialisé avec plusieurs arguments les crée sous forme de paires clé-valeur:

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

Donc, dans votre exemple, cela mènerait au hachage suivant:

{"first_name"=>"mickey", "last_name"=>"mouse", "county"=>"usa"}
7
Dan Rosenstark