Ce n'param: _* moyenne en Scala?
Être de nouveau à la Scala (2.9.1), j'ai un List[Event]
et voudrais le copier dans un Queue[Event]
, mais la Syntaxe suivante donne un Queue[List[Event]]
à la place:
val eventQueue = Queue(events)
Pour une raison quelconque, les ouvrages suivants:
val eventQueue = Queue(events : _*)
Mais je voudrais comprendre ce qu'il 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 quel est le sens de la seconde? Qu'est-ce que :
, et _*
dans ce cas, et pourquoi ne pas le apply
fonction il suffit de prendre un Iterable[A]
?
Vous devez vous connecter pour publier un commentaire.
a: A
est de type nom; voir Quel est le but de type ascriptions en Scala?: _*
est un cas spécial de type nom qui indique au compilateur de traiter un seul argument d'un type de séquence comme une variable de séquence d'argument, c'est à dire varargs.Il est tout à fait valable, pour créer un
Queue
à l'aide deQueue.apply
qui a un seul élément qui est une séquence ou itératif, c'est exactement ce qui se passe quand vous donnez un seulIterable[A]
.C'est une notation spéciale, qui indique au compilateur de passer chaque élément de son propre raisonnement, plutôt que de tous comme un seul argument. Voir ici.
C'est un type d'annotation qui indique un séquence argument et est mentionné comme une "exception" à la règle générale de la section 4.6.2 de la langue spec", a Répété Paramètres".
Il est utile si une fonction prend un nombre variable d'arguments, par exemple, une fonction telle que
def sum(args: Int*)
, qui peut être invoquée commesum(1)
,sum(1,2)
etc. Si vous avez une liste commexs = List(1,2,3)
, vous ne pouvez pas passerxs
lui-même, parce que c'est unList
plutôt qu'unInt
, mais vous pouvez passer d'un de ses éléments à l'aide desum(xs: _*)
.def sum(xs: _*)
jette 'error: unbound générique de type"xs: int
signifie le type de x est de type int , en passant par qui est au-dessus d'une syntaxe en scala, oùxs: _*
signifie xs est coulé à chacun de ses membres.Pour Python gens:
Scala
_*
opérateur est plus ou moins l'équivalent de Python *-opérateur.Exemple
La conversion de la scala exemple de la lien fournis par Luigi Plinge:
Python pourrait ressembler à:
et à la fois donner le résultat suivant:
La Différence: le déballage des paramètres positionnels
Tout en Python
*
-opérateur peut également traiter avec le déballage de position paramètres/paramètres pour les fonctions d'arité:Faire la même chose avec Scala:
échouera:
Mais il est possible de réaliser la même chose avec scala:
Selon Lorrin Nelson voilà comment cela fonctionne:
Plus lecture: