此Scala代码在Scala 2.13下编译
val res = new scala.collection.mutable.StringBuilder
"hello".foreach { c =>
if (true) {
(0 until 10).foreach( res += c )
}
}
如果看到该foreach
方法缺少匿名函数的参数。当它执行时,会给出一个令人费解的异常StringIndexOutOfBoundsException
,res += c
因为它StringBuilder
应该始终是可附加的。
以下代码运行良好,没有例外。唯一的变化是_
为foreach
参数功能添加了占位符:
val res = new scala.collection.mutable.StringBuilder()
"hello".foreach { c =>
if (true) {
(0 until 10).foreach( _ => res += c )
}
}
您问题的答案在于String.apply()
或StringBuilder.apply()
更确切地说。
您看,foreach
期望功能。用更准确的话来说就是一个计算为函数的表达式。
因此,它将首先对表达式求值以获得函数,然后将该函数应用于 0 until 10
因此,当您考虑external的第一次迭代时foreach
,您拥有c = 'h'
并遵循,
(0 until 10).foreach(res += c )
在这里,res += c
将res
在追加后返回h
。
所以...评估的功能res
或res.apply
使用res = "h"
。因此,以上实际上是
(0 until 10).foreach("h".apply)
因此,res.apply(0)
进展顺利...却res.apply(1)
失败了StringIndexOutOfBoundsException
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句