English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Клони в Scala

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

Клозур можно просто понять как функцию, которая может доступ к локальным переменным функции.

Вот следующий анонимный функционал:

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

Внутри функции есть переменная i, которая является параметром функции. Вот следующий фрагмент кода:

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

В multiplier есть две переменные: i и factor. Одна из них i — это формальный параметр функции, который принимает новый значение при вызове функции multiplier. Однако, factor не является формальным параметром, а свободной переменной. Рассмотрим следующий код:

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

Здесь мы вводим свободную переменную factor, которая определена вне функции.

Так определенная функция переменная multiplier становится "клоном", потому что она ссылается на переменные, определенные вне функции. Процесс определения этой функции заключается в захвате этой свободной переменной и создании заключенной функции.

Полный пример

object Test {  
   def main(args: Array[String]) {  
      println( "мультипликатор(1) значение = " +  multiplier(1) )  
      println( "мультипликатор(2) значение = " +  multiplier(2) )  
   }  
   var factor = 3  
   val multiplier = (i:Int) => i * factor  
}

Выполните вышеуказанный код, результат вывода будет:

$ scalac Test.scala  
$  scala Test  
мультипликатор(1) значение = 3 
мультипликатор(2) значение = 6