web-dev-qa-db-fra.com

Sucre de syntaxe: _ * pour traiter Seq en tant que paramètres de méthode

Je viens de remarquer cette construction quelque part sur le web:

val list = List(someCollection: _*)

Que signifie _*? Est-ce un sucre de syntaxe pour un appel de méthode? Quelles contraintes ma classe personnalisée devrait-elle satisfaire pour pouvoir tirer parti de cette syntaxe, sucre?

45
user7865221

Généralement, la notation : est utilisée pour l'attribution de type, forçant le compilateur à voir une valeur d'un type particulier. Ce n'est pas tout à fait la même chose que le casting.

val b = 1 : Byte
val f = 1 : Float
val d = 1 : Double

Dans ce cas, vous attribuez le type spécial varargs . Cela reflète la notation astérisque utilisée pour déclarer un paramètre varargs et peut être utilisé sur une variable de tout type comportant des sous-classes Seq[T]:

def f(args: String*) = ... //varargs parameter, use as an Array[String]
val list = List("a", "b", "c")
f(list : _*)
68
Kevin Wright

C'est la syntaxe scala pour l'explosion d'un tableau. Certaines fonctions prennent un nombre variable d'arguments et pour transmettre un tableau, vous devez ajouter : _* à l'argument tableau.

17
davidk01

Variable (nombre de) Les arguments sont définis avec *. Par exemple, 

def wordcount(words: String*) = println(words.size)

wordcount attend une chaîne en tant que paramètre, 

scala> wordcount("I")
1

mais accepte plus de chaînes comme paramètre d'entrée (_ * est nécessaire pour le type ascription)

scala> val wordList = List("I", "love", "Scala")
scala> wordcount(wordList: _*)
3
0
GraceMeng