Pour les gens de Python:
L' _*
opérateur de Scala est plus ou moins l'équivalent de l' opérateur * de Python .
Exemple
Conversion de l'exemple scala à partir du lien fourni par Luigi Plinge :
def echo(args: String*) =
for (arg <- args) println(arg)
val arr = Array("What's", "up", "doc?")
echo(arr: _*)
en Python ressemblerait à:
def echo(*args):
for arg in args:
print "%s" % arg
arr = ["What's", "up", "doc?"]
echo(*arr)
et les deux donnent la sortie suivante:
Quoi de
neuf
doc?
La différence: déballage des paramètres de position
Alors que l' *
opérateur de Python peut également gérer le déballage des paramètres / paramètres de position pour les fonctions à arité fixe:
def multiply (x, y):
return x * y
operands = (2, 4)
multiply(*operands)
8
Faire de même avec Scala:
def multiply(x:Int, y:Int) = {
x * y;
}
val operands = (2, 4)
multiply (operands : _*)
échouera:
pas assez d'arguments pour la méthode multipliée: (x: Int, y: Int) Int.
Paramètre de valeur non spécifié y.
Mais il est possible de réaliser la même chose avec scala:
def multiply(x:Int, y:Int) = {
x*y;
}
val operands = (2, 4)
multiply _ tupled operands
Selon Lorrin Nelson, voici comment cela fonctionne:
La première partie, f _, est la syntaxe d'une fonction partiellement appliquée dans laquelle aucun des arguments n'a été spécifié. Cela fonctionne comme un mécanisme pour mettre la main sur l'objet de fonction. tupled renvoie une nouvelle fonction d'arity-1 qui prend un seul tuple arity-n.
Lire plus:
def sum(xs: _*)
jette 'erreur: type générique non lié'