Это не обычный функциональный код 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()
}