182 votes

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 ce qu'il y a 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 ce cas s'avère difficile...)

281voto

molf Points 34978

El * est le splat opérateur.

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

À titre d'illustration, les deux affirmations suivantes sont égales :

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

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

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

Des informations plus détaillées ici .

36 votes

En général, lorsqu'il est utilisé dans une situation de type LHS (à chaque fois que vous l'invoquez sur une valeur), splat divise un tableau en valeurs séparées, et lorsqu'il est utilisé dans une situation de type RHS (à chaque fois que vous l'utilisez sur des variables précédemment non définies), il regroupe des valeurs séparées dans un tableau. Donc a,b,*c = d,e,f,*g définit a=d, b=e, et c=[f,g0,g1,g2,...,gn], où g=[g0,g1,g2,...,gn]

2 votes

Pour être complet, l'opérateur splat transforme un tableau en une liste nue selon la terminologie utilisée dans "The Well Grounded Rubyist" de David A. Black.

12 votes

@rampion : Merveilleux commentaire, vous venez de mélanger LHS et RHS. C'est l'inverse.

51voto

BJ Homer Points 29168

L'opérateur splat décompose un tableau passé à une fonction de façon à ce que chaque élément soit envoyé à la fonction comme un 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 !

7voto

Yar Points 25421

Comme tout le monde le mentionne, c'est un "splat". Chercher 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 cherchez sur

asterisk in ruby syntax

dans Google. Google est là pour vous, il suffit de mettre en mots ce que vous voyez.

Quoi qu'il en soit, comme beaucoup de code Ruby, ce code est assez dense. Le site

line.split(/=|;/)

fait un tableau de SIX éléments, first_name, mickey, last_name, mouse, country, usa . Ensuite, la méthode Splat est utilisée pour transformer le tout en un Hash. Les gens de Ruby vous envoient toujours voir la méthode Splat, puisque tout est exposé en Ruby. Je n'ai aucune idée de l'endroit où elle se trouve, mais une fois que vous l'aurez, vous verrez qu'elle exécute une méthode for à travers le tableau et construit le hachage.

Il faut chercher le code dans la section noyau dur documentation. Si vous ne la trouvez pas (je n'ai pas pu), vous pouvez essayer d'écrire un code comme celui-ci (qui fonctionne, mais qui n'est PAS un code de type 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 l'équipe de Ruby pourra alors vous dire pourquoi votre code est stupide, mauvais ou tout simplement erroné.

Si vous avez lu jusqu'ici, jetez un coup d'oeil à la page Hash pour l'initialisation.

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

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

Ainsi, dans votre exemple, cela conduirait au hachage suivant :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X