闭包是一个函数,这个函数的返回值 取决于 函数外部 变量,可以一个或者多个变量。
这个概念有点不好理解,下面一步一步来说明。
首先,定义一个匿名函数: val func_closure = (i:Int) => i * 10 * 20,那么 func_closure(1) =1*10*20= 200
然后,闭包就是在这个基础上,把 匿名函数中的常数 10,20变为 定义在匿名函数外面的 2个变量,代码为:
var c = 10
val d = 20
val func_closure = (i:Int) => i * c * d
如果调用 func_closure(1) 结果也是 200,只是把用变量 c 、d来替代了原来的常量。
像这种 引用外面定义的变量 的函数,就是闭包,这里的 闭是封闭的意思,把外面的变量放到函数里构成了一个封闭的函数。
代码如下:
object Test {
def main(args:Array[String]){
var c = 10 //这个是局部变量,并不会影响结果
println("func_closure(1)= "+ func_closure(1))
d = 20 //这个是对外层的变量赋值20,会影响结果
println("func_closure(1)= "+ func_closure(1))
}
//这2个变量必须要在函数外面定义,不能定义在main函数里
//全局变量
var c = 5
var d = 5
val func_closure = (i:Int) => i * c * d
}
输出:
C:\Users\Administrator\Desktop>scala Test.scala
func_closure(1)= 25
func_closure(1)= 100
下面解释一下输出结果,第1个是25,因为c和d都为5,虽然在main函数中定义了新的变量c并赋值10,但是func_closure中引用的是外层的c变量,而不是main中的c变量,所以不会影响结果。
之后输出100,是因为c变量是5,而d变量在main函数中改为20了,这里的d变量就是外层定义的d变量。
更进一步的,外部定义的变量,也可以是另一个匿名函数:
object Test {
def main(args:Array[String]){
println("func_closure(1)= "+ func_closure(1))
}
var c = 5
var d = (i:Int) => i*10
val func_closure = (i:Int) => c * d(i)
}
输出结果为 50
这里的外部变量d 是匿名函数,从这里也可以看出scala语言是非常灵活的。
本文详细解析了Scala语言中的闭包概念,通过实例演示了如何使用闭包引用外部变量,展示了Scala的灵活性。
1287

被折叠的 条评论
为什么被折叠?



