Premièrement. Considérez le code suivant
scala> val fail = (x: Any) => { throw new RuntimeException }
fail: Any => Nothing =
scala> List(1).foreach(fail)
java.lang.RuntimeException
at $anonfun$1.apply(:7)
at $anonfun$1.apply(:7)
at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
Il y a un anonfun supplémentaire entre foreach et l'exception. On s'attend à ce qu'il s'agisse d'une valeur de fail
lui-même (objet d'une classe Function1[]), mais d'où vient le deuxième?
La signature de foreach
prend cette fonction:
def foreach[U](f: A => U): Unit
Alors, quel est le but du deuxième?
Deuxièmement, considérons le code suivant:
scala> def outer() {
| def innerFail(x: Any) = { throw new RuntimeException("inner fail") }
|
| Set(1) foreach innerFail
| }
outer: ()Unit
scala> outer()
java.lang.RuntimeException: inner fail
at .innerFail$1(:8)
at $anonfun$outer$1.apply(:10)
at $anonfun$outer$1.apply(:10)
at scala.collection.immutable.Set$Set1.foreach(Set.scala:86)
Il y a deux anonfuns supplémentaires... sont-ils vraiment nécessaires? :-E