【Scala】闭包

本文详细解析了Scala语言中的闭包概念,通过实例演示了如何使用闭包引用外部变量,展示了Scala的灵活性。

闭包是一个函数,这个函数的返回值 取决于 函数外部 变量,可以一个或者多个变量。

这个概念有点不好理解,下面一步一步来说明。

首先,定义一个匿名函数: 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语言是非常灵活的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值