【问题标题】:Why is the each iteration parameter val and not var in for loop in scala为什么scala中for循环中的每个迭代参数都是val而不是var
【发布时间】:2017-10-25 17:40:15
【问题描述】:

我是 Scala 初学者,开始学习“Scala 编程”。我遇到了以下代码。

for (arg <- args)
println(arg)

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

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

以下是我的问题

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

我也知道 scala 中 var 和 val 的区别。我已经浏览了这个链接。 What is the difference between a var and val definition in Scala?

【问题讨论】:

    标签: scala for-loop


    【解决方案1】:

    在 Scala 中,for 理解是 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 集合库保持对列表的可变引用,但从在通过f(these.head) 作为调用者暴露给您的A 类型的每个值之外是不可变的,因此实际上不需要像在C 风格的for 循环中那样重新分配对值的引用。

    【讨论】:

      猜你喜欢
      • 2020-08-07
      • 2018-07-05
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多