Scala中闭包

闭包

闭包是由函数和运行时的数据决定的。闭包也可以理解为函数和上下文。

scala> var i = 15
i: Int = 15

// 定义一个函数自变量f,函数中使用了前面定义的变量i
scala> val f = (x:Int)=>x + i
f: Int => Int = <function1>

执行函数
scala> f(10)
res0: Int = 25

// 变量重新赋值
scala> var i = 20
i: Int = 20

// 执行函数
scala> f(10)
res1: Int = 25

       代码 val f = (x:Int) => x + i 定义了一个函数自变量,函数中使用了自由变量,变量i在程序的运行过程中会发生变化,在函数执行时如调用f(10)时会根据运行时变量i的值的不同,得到不同的运行结果。自由变量i在运行过程中会不断发生变化,它处于一种开放的状态,而程序执行时,自由变量i的值已经被确定下来,此时可以认为在运行时它暂时处于封闭状态,这种存在从开放到封闭过程的函数被称为闭包。 函数字面量 val f = (x:Int) => x + i 中便是函数f + 上下文(自由变量i)的结合。

       高阶函数也可以理解为一种闭包。

scala> def a(f:Double => Double, p:Double=>Unit)={
     |   val x = f(10)
     |   p(x)
     | }
a: (f: Double => Double, p: Double => Unit)Unit

scala> val f = (x:Double)=> x*2
f: Double => Double = <function1>

scala> val p = (x:Double)=> println(x)
p: Double => Unit = <function1>

// 将定义的函数f、p作为高阶函数a的参数
scala> a(f, p)
20.0

// 重新定义函数f
scala> val f = (x:Double)=> x*x
f: Double => Double = <function1>

// 再次将定义的函数f、p作为高阶函数a的参数
scala> a(f, p)
100.0

函数 a 根据两次传入的函数f、p,得到了两次不同的结果。所以函数 def a(f:Double => Double, q:Double => Unit) 就是由函数(高阶函数a)和上下文(两次传入的f、p)构成的。

参考自:《Scala开发快速入门》

猜你喜欢

转载自blog.csdn.net/zzlove1234567890/article/details/100191727
今日推荐