Учебники

Скала — Закрытие

Замыкание — это функция, возвращаемое значение которой зависит от значения одной или нескольких переменных, объявленных вне этой функции.

Следующий кусок кода с анонимной функцией.

val multiplier = (i:Int) => i * 10

Здесь единственная переменная, используемая в теле функции, i * 10, это i, которая определяется как параметр функции. Попробуйте следующий код —

val multiplier = (i:Int) => i * factor

В множителе есть две свободные переменные: i и factor . Один из них, i, является формальным параметром функции. Следовательно, он связан с новым значением каждый раз, когда вызывается множитель. Однако фактор не является формальным параметром, тогда что это? Давайте добавим еще одну строку кода.

var factor = 3
val multiplier = (i:Int) => i * factor

Теперь фактор имеет ссылку на переменную вне функции, но во вложенной области видимости. Функция ссылается на множитель и каждый раз считывает его текущее значение. Если функция не имеет внешних ссылок, она тривиально замкнута над собой. Внешний контекст не требуется.

Попробуйте следующий пример программы.

пример

object Demo {
   def main(args: Array[String]) {
      println( "multiplier(1) value = " +  multiplier(1) )
      println( "multiplier(2) value = " +  multiplier(2) )
   }
   var factor = 3
   val multiplier = (i:Int) => i * factor
}

Сохраните вышеуказанную программу в Demo.scala . Следующие команды используются для компиляции и выполнения этой программы.