Первый. Рассмотрим следующий код:Почему scalac генерирует дополнительные/упаковочные затворы
scala> val fail = (x: Any) => { throw new RuntimeException }
fail: Any => Nothing = <function1>
scala> List(1).foreach(fail)
java.lang.RuntimeException
at $anonfun$1.apply(<console>:7)
at $anonfun$1.apply(<console>:7)
at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
Существует дополнительный анонс между foreach и исключением. Ожидается, что одно из значений будет иметь значение fail
(объект класса Function1 []), но откуда берется второе?
foreach
подпись берет эту функцию:
def foreach[U](f: A => U): Unit
Итак, какова цель второго?
Во-вторых, рассмотрим следующий код:
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(<console>:8)
at $anonfun$outer$1.apply(<console>:10)
at $anonfun$outer$1.apply(<console>:10)
at scala.collection.immutable.Set$Set1.foreach(Set.scala:86)
Есть два дополнительных anonfuns ... действительно ли они нужны? : -E
Версия Scala 2.9.2.rdev-2769-2011-12-13-g2dd83da (виртуальная машина Java HotSpot TM TM, Java 1.6.0_25). – tuxSlayer