2013-04-09 3 views
1

J'ai une question concernant les étoiles dans cette méthode:S'il vous plaît expliquer cette méthode

def multiplies_array(*numbers) 
    numbers.inject(1, :*) 
end 

Quelle est la signification de l'étoile dans la liste des arguments (*numbers)? Et quelle est la signification de l'étoile après le colon (1, :*)?

+1

Le premier est un "opérateur splat", google it. Deuxième est un symbole régulier (lire la documentation sur 'Enumerable # injecter. –

Répondre

2

La première étoile est l'opérateur splat. Dans ce cas, il "recueille" tous les paramètres donnés à multiplies_array dans un seul tableau.

appel comme ceci avec quatre paramètres ...

multiplies_array 1, 2, 3, 4 

... vous donne un tableau unique avec quatre éléments dans la méthode.

Cela équivaut à:

def multiplies_array(numbers) # Without splat operator 
end 

multiplies_array [1, 2, 3, 4] 

La deuxième étoile est un peu déroutant. On entend ici par opérateur de multiplication:

Le : représente un symbole. Toutes les méthodes Enumerable permettent de passer un symbole en tant que raccourci. Cela signifie: "Appelez la méthode avec ce nom". En d'autres termes, la méthode * est appliquée à chaque élément de la matrice de nombres. Sans le raccourci symbole de cette ligne ressemblerait à ceci:

numbers.inject(1) { |result, number| result * number) } 

J'espère que cela jette un peu de lumière sur tout ce que la magie Ruby :)

+0

... Merci! :) –

+0

une autre petite question. sauf si% w (le et plus) .include? (Chaîne [index]) Qu'est-ce que% w? –

+1

@JohnOggy postez comme une question différente. Qu'est-ce que "% w"? –

1

Voir la documentation inject.

Il « combine tous les éléments de enum en appliquant une opération binaire, spécifiée par un bloc ou un symbole qui nomme une méthode ou un opérateur. "

Ainsi, le :* spécifie l'opérateur de multiplication dans numbers.inject(1, :*) Le :* il spécifie comme un symbole mais vous pouvez faire numbers.inject(1, '*') aussi bien. L'utilisation d'un symbole est plus idiomatique.

Questions connexes