48 votes

Carte Scala pour chaque

donné:

 val m = Map[String, Int]("a" -> 1, "b" -> 2, "c" -> 3)
m.foreach((key: String, value: Int) => println(">>> key=" + key + ", value=" + value))
 

pourquoi le compilateur se plaint-il

 error: type mismatch
found   : (String, Int) => Unit
required: (String, Int) => ?
 

76voto

Philippe Points 5372

Je ne suis pas sûr de l'erreur, mais vous pouvez obtenir ce que vous voulez comme suit:

 m.foreach(p => println(">>> key=" + p._1 + ", value=" + p._2))
 

C'est-à-dire que foreach prend une fonction qui prend une paire et renvoie Unit , pas une fonction qui prend deux arguments: ici, p a le type (String, Int) .

Une autre façon de l'écrire est:

 m.foreach { case (key, value) => println(">>> key=" + key + ", value=" + value) }
 

Dans ce cas, le bloc { case ... } est une fonction partielle.

31voto

Dzhu Points 1563

oups, lisez le doco faux, map.foreach attend un littéral de fonction avec un argument de tuple!

alors

 m.foreach((e: (String, Int)) => println(e._1 + "=" + e._2))
 

travaux

15voto

huitseeker Points 6049

Vous devez appliquer une correspondance sur l'argument Tuple2 pour affecter des variables à ses sous-parties key , value . Vous pouvez faire avec très peu de changements:

 m.foreach{ case (key: String, value: Int) => println(">>> key=" + key + ", value=" + value)} 
 

14voto

Paul Butcher Points 5349

Le message d'erreur déroutant est un bogue du compilateur, qui devrait être corrigé dans la version 2.9.2 :

5voto

Eishay Smith Points 712

Excellente question! Même en tapant explicitement la méthode foreach, cela donne toujours cette erreur de compilation très peu claire. Il y a différentes façons de contourner le problème, mais je ne comprends pas pourquoi cet exemple ne fonctionne pas.

 scala> m.foreach[Unit] {(key: String, value: Int) => println(">>> key=" + key + ", value=" + value)}
<console>:16: error: type mismatch;
 found   : (String, Int) => Unit
 required: (String, Int) => Unit
              m.foreach[Unit] {(key: String, value: Int) => println(">>> key=" + key + ", value=" + value)}
                                                         ^
 

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