首先,考虑以下代码:
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
和exception
之间有额外的anonfun
。其中一个预期是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
("anonfuns"可能指匿名函数)