Замыкание — это функция, возвращаемое значение которой зависит от значения одной или нескольких переменных, объявленных вне этой функции.
Следующий кусок кода с анонимной функцией.
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 . Следующие команды используются для компиляции и выполнения этой программы.