gpt4 book ai didi

scala - 为什么这段代码编译并在执行时给出运行时错误

转载 作者:行者123 更新时间:2023-12-01 07:47:39 24 4
gpt4 key购买 nike

此 Scala 代码在 Scala 2.13 下编译

val res = new scala.collection.mutable.StringBuilder
"hello".foreach { c =>
if (true) {
(0 until 10).foreach( res += c )
}
}

如果您看到 foreach 方法缺少匿名函数的参数。当它被执行时,它为 res += c 给出了一个异常 StringIndexOutOfBoundsException,这令人费解,因为 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

因此,当您考虑外部 foreach 的第一次迭代时, 你有 c = 'h'和以下,

(0 until 10).foreach(res += c )

在这里,res += c将返回 res附加 h

所以...求值函数是resres.applyres = "h" .因此,以上实际上是,

(0 until 10).foreach("h".apply)

所以,res.apply(0)一切顺利……但是res.apply(1)失败 StringIndexOutOfBoundsException .

关于scala - 为什么这段代码编译并在执行时给出运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59756391/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com