3 votes

Scala passe des varargs à une autre fonction qui prend des varargs

Pourquoi varargs ne peut pas être passé comme un autre varargs sans :_* ?

object Main {

  def main(s: Array[String]): Unit = {

    def someFunction(varars: String*) = {
      someOtherFunction(varars) // Compilation ERRRO 
      someOtherFunction(varars:_*) // Works, but why ?  
    }

    def someOtherFunction(someOtherVarars: String*): Unit = {
    }
  }
}

4voto

Andronicus Points 9662

C'est parce que varars est un seul argument - un tableau de chaînes de caractères (notez, que je n'écris pas Array[String] parce que ce n'est pas le site java Array plus de détails aquí ), alors qu'en regardant la signature def someOtherFunction(someOtherVarars: String*): Unit on peut dire, que someOtherFunction prend plusieurs arguments de type String chacun. Vous ne pouvez pas simplement passer un tableau comme paramètre à la fonction someOtherFunction vous devez d'abord le "déplier".

En d'autres termes, un argument peut être passé à someOtherFunction il doit être marqué comme un argument de séquence. Cela n'aurait pas beaucoup de sens de pouvoir faire passer varargs y varargs(1) à la fonction unique. Elle est décrite dans SLS §4.6.2 .

3voto

Sangeeta Points 221

Le paramètre "varargs" signifie qu'il peut prendre un nombre quelconque de chaînes de caractères comme argument (c'est-à-dire un champ varargs).

def someFunction(varars : String*) : Seq[String] = { varars }

si vous définissez la méthode ci-dessus et vérifiez le type de "varars", elle est maintenant devenue Seq[String] lorsque vous l'utilisez. Mais lorsque vous le passez à une autre méthode qui attend le type variableArgs. Il n'y a pas de correspondance car il est devenu Seq[String] qui devrait être converti en arguments variables en utilisant (someOtherVarars : _*).

L'opérateur _* indique au compilateur de passer chaque élément de la séquence comme un argument séparé, au lieu de le passer comme un seul argument.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X