Étant nouveau dans Scala (2.9.1), j'ai un List[Event]
et je voudrais le copier dans un Queue[Event]
, mais la syntaxe suivante donne un à la Queue[List[Event]]
place:
val eventQueue = Queue(events)
Pour une raison quelconque, ce qui suit fonctionne:
val eventQueue = Queue(events : _*)
Mais j'aimerais comprendre ce que ça fait, et pourquoi ça marche? J'ai déjà regardé la signature de la Queue.apply
fonction:
def apply[A](elems: A*)
Et je comprends pourquoi la première tentative ne fonctionne pas, mais quelle est la signification de la seconde? Qu'est-ce que :
, et _*
dans ce cas, et pourquoi la apply
fonction ne prend- elle pas simplement un Iterable[A]
?
def sum(xs: _*)
jette 'erreur: type générique non lié'xs: int
signifie que le type de xs est int, en passant par là, une syntaxe dans scala oùxs: _*
signifie que xs est casté vers ses membres individuels.def sum(args: Int*)
et vous l' appelez avec le caractère générique de type var-args « générique »:val a = sum(xs: _*)
. Pensez à_*
«Je passe un Int *, ou une chaîne *, ou tout ce qui est défini dans la signature de la méthode»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:
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)
Faire de même avec Scala:
def multiply(x:Int, y:Int) = { x * y; } val operands = (2, 4) multiply (operands : _*)
échouera:
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:
Lire plus:
la source