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?
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 : _*)
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.
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