Определение переменной в литерале функции Scala - PullRequest
0 голосов
/ 12 ноября 2018

Мне интересно, результат кода

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()
    }
  }
}

Почему переменная t в hello функция назначается только один раз ,, и результат будет 6, 9, 12 ....

Полагаю, это может быть связано со свойством замыкания ,, но почему var t = 3 выполняется только один раз?

1 Ответ

0 голосов
/ 12 ноября 2018

Это не обычный функциональный код Scala, где неизменяемость и значения предпочтительнее изменчивости.Стиль напоминает мне Javascript, где подобные вещи встречаются очень часто.Да, вы правы, это связано с закрытием:

  • Метод hello определяет область действия.В этой области существуют две вещи: переменная t и лямбда (литерал функции () => {...})
  • Лямбда возвращается как возвращаемое значение из метода hello, назначенного в test переменная и многократно выполняется в цикле while
  • Лямбда меняет переменную t, которая в ней записана.

Переменная существует в области видимостиhello, но, поскольку она захвачена лямбда-выражением, это та же самая переменная, которая используется снова и снова.Это не область приветствия, которая выполняется из цикла while, а лямбда-тело.hello выполняется только один раз, чтобы создать переменную t и лямбду.

Расширение определения hello может помочь вам понять это проще:

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

Это может бытьпреобразованный в следующий код с той же функциональностью, будет расширена только область действия t, так что даже код, отличный от лямбды, сможет его увидеть:

var t = 3
val test = () => {
    t = t + 3
    println(t)
  }
while (true) {
  Thread.sleep(1000)
  test()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...