Un autre point est que la première phrase est analysée comme suit :
scala> List(1,2,3).++(List(4,5))
res0: List[Int] = List(1, 2, 3, 4, 5)
Alors que le deuxième exemple est interprété comme :
scala> List(4,5).:::(List(1,2,3))
res1: List[Int] = List(1, 2, 3, 4, 5)
Donc si vous utilisez des macros, vous devez faire attention.
D'ailleurs, ++
pour deux listes est d'appeler :::
mais avec plus de frais généraux car il demande une valeur implicite pour avoir un constructeur de liste à liste. Mais les microbenchmarks n'ont rien prouvé d'utile dans ce sens, je suppose que le compilateur optimise ces appels.
Micro-benchmarks après le réchauffement.
scala>def time(a: => Unit): Long = { val t = System.currentTimeMillis; a; System.currentTimeMillis - t}
scala>def average(a: () => Long) = (for(i<-1 to 100) yield a()).sum/100
scala>average (() => time { (List[Int]() /: (1 to 1000)) { case (l, e) => l ++ List(e) } })
res1: Long = 46
scala>average (() => time { (List[Int]() /: (1 to 1000)) { case (l, e) => l ::: List(e ) } })
res2: Long = 46
Comme l'a dit Daniel C. Sobrai, vous pouvez ajouter le contenu de n'importe quelle collection à une liste à l'aide de la fonction ++
alors qu'avec :::
vous pouvez seulement concaténer des listes.
4 votes
Aussi
:::
est un opérateur préfixe comme toutes les méthodes commençant par:
3 votes
Les réponses délimitent assez bien la façon dont Scala a évolué autour des listes et de l'uniformité des opérateurs en Scala (ou l'absence de cette dernière). Il est un peu malheureux que quelque chose d'aussi simple ait un si grand nombre de détails pour embrouiller et faire perdre du temps à tout apprenant de Scala. J'aimerais que cela soit nivelé dans la 2.12.