为什么每次迭代参数 val 而不是 var 在 scala 中的 for 循环中


我是Scala

初学者,开始学习"Programming in Scala"。我遇到了以下代码。

for (arg <- args)
println(arg)

在书中,它说的arg是val类型而不是var。为什么会这样。

根据我对每次迭代的理解,arg 的值都会发生变化,因为它每次循环时都会保留新值。

以下是我的问题

  1. 为什么是 arg val 而不是 var ?
  2. 根据 Scala
  3. ,如果它是 val,我们无法更改值(因为它在 Scala 中是最终的(
  4. 它还会为每次迭代创建多个对象以及如何循环后销毁的对象?

我也知道 scala 中 var 和 val 之间的区别。我已经浏览了这个链接。Scala 中的 var 和 val 定义有什么区别?

在斯卡拉语中,理解是语法糖超过foreachmapflatMapfilter组合器。当你写:

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 循环那样重新分配对值的引用。

最新更新