初学者,开始学习"Programming in Scala"。我遇到了以下代码。
for (arg <- args)
println(arg)
在书中,它说的arg是val类型而不是var。为什么会这样。
根据我对每次迭代的理解,arg 的值都会发生变化,因为它每次循环时都会保留新值。
以下是我的问题
- 为什么是 arg val 而不是 var ? 根据 Scala
- ,如果它是 val,我们无法更改值(因为它在 Scala 中是最终的(
- 它还会为每次迭代创建多个对象以及如何循环后销毁的对象?
我也知道 scala 中 var 和 val 之间的区别。我已经浏览了这个链接。Scala 中的 var 和 val 定义有什么区别?
在斯卡拉语中,理解是语法糖超过foreach
、map
、flatMap
和filter
组合器。当你写:
for (arg <- args)
编译器重写为:
args.foreach { }
由于foreach
为每个元素引入了一个新值,因此您实际上不会将arg
重新分配给任何内容:
args.foreach { arg => // }
例如,如果我们看一下List.foreach
的实现:
@inline final override def foreach[U](f: A => U) {
var these = this
while (!these.isEmpty) {
f(these.head)
these = these.tail
}
}
您会看到 these
是一个在迭代列表时重新分配的var
,因此 Scala 集合库在内部保留对列表的可变引用,但从外部A
通过 f(these.head)
作为调用者向你公开的每个类型值都是不可变的,因此实际上不需要像 C 样式的 for 循环那样重新分配对值的引用。