首页 文章

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

提问于
浏览
2

我是Scala初学者并开始经历“Scala编程” . 我遇到了以下代码 .

for (arg <- args)
println(arg)

在书中它说 arg is of type val and not var . 为什么会如此 .

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

以下是我的问题

  • 为什么 arg val而不是var?

  • 根据Scala,如果它是 val ,我们无法更改值(因为它在Scala中是最终的)

  • 它还会为每次迭代创建多个对象以及循环后对象如何被销毁?

我也知道scala中var和val之间的区别 . 我已经看过这个链接 . What is the difference between a var and val definition in Scala?

1 回答

  • 7

    在Scala中,理解是 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
      }
    }
    

    您看到 thesethese ,在您迭代列表时会重新分配,因此Scala集合库内部保留对列表的可变引用,但是从外部通过 f(these.head) 将每个值 A 的值暴露给您作为调用者是不可变的,因此实际上不需要重新分配对C语言for循环中的值的引用 .

相关问题