0

我想知道这段代码的结果

object localTest {
  def hello = {
    var t = 3
    () => {
      t = t + 3
      println(t)
    }
  }
}
object mainObj {
  def main(args: Array[String]): Unit = {
    val test = localTest.hello
    while (true) {
      Thread.sleep(1000)
      test()
    }
  }
}

为什么函数中的变量thello赋值一次,结果是6,9,12....

我猜这可能与闭包属性有关,但为什么var t = 3只执行一次?

4

1 回答 1

2

这不是通常的函数式 Scala 代码,其中不可变和 val 优于可变性。这种风格让我想起了 Javascript,在这种情况下经常看到这样的事情。是的,你是对的,这与关闭有关:

  • hello方法定义了一个范围。在这个范围内,存在两件事:t变量和 lambda(函数字面量() => {...}
  • lambda 作为方法的返回值返回hello,分配给test变量并由while循环重复执行
  • lambda 正在更改t其中捕获的变量。

该变量存在于 的范围内hello,但由于它被 lambda 捕获,它是否是一次又一次使用的同一个变量。从while循环中执行的不是 hello 范围,而是 lambda 主体。hello仅执行一次以创建变量t和 lambda。

扩展hello定义可能会帮助您更轻松地理解这一点:

val test = {
  var t = 3
  () => {
    t = t + 3
    println(t)
  }
}
while (true) {
  Thread.sleep(1000)
  test()
}

这可以转换为具有相同功能的以下代码,仅t扩展范围,以便即使 lambda 以外的代码也可以看到它:

var t = 3
val test = () => {
    t = t + 3
    println(t)
  }
while (true) {
  Thread.sleep(1000)
  test()
}
于 2018-11-12T07:35:05.567 回答