2009-11-13 6 views
36

la ligneruby: qu'est-ce que l'astérisque dans "p * 1..10" signifie

p *1..10 

fait exactement la même chose que

(1..10).each { |x| puts x } 

qui vous donne le résultat suivant:

$ ruby -e "p *1..10" 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

C'est un excellent raccourci lorsque vous travaillez avec textmate par exemple, mais que fait l'astérisque? Comment ça marche? n'a pas pu trouver quoi que ce soit sur le net ...

Répondre

60

C'est le splat operator. Vous le verrez souvent utilisé pour diviser un tableau en paramètres d'une fonction.

def my_function(param1, param2, param3) 
    param1 + param2 + param3 
end 

my_values = [2, 3, 5] 

my_function(*my_values) # returns 10 

Plus généralement il est utilisé pour accepter un nombre arbitraire d'arguments

def my_other_function(to_add, *other_args) 
    other_args.map { |arg| arg + to_add } 
end 

my_other_function(1, 6, 7, 8) # returns [7, 8, 9] 

Il travaille également pour l'attribution multiple (bien que ces deux déclarations ne fonctionnera sans floc):

first, second, third = *my_values 
*my_new_array = 7, 11, 13 

Pour votre exemple, ces deux seraient équivalents:

p *1..10 
p 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 
+1

il me semble que a, b, c = * myvalues ​​ est équivalent à a, b, c = myvalues ​​ ou est-ce que ruby ​​utilise implicitement l'opérateur splat dans ce cas? –

+0

@Patrick Oui, une affectation où il y a un objet d'un côté et plusieurs objets de l'autre implique en quelque sorte un opérateur splat. Donc, ce n'est pas un exemple très utile, je suppose. – Neall