Scala中的闭包函数

闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量。

闭包通常来讲可以简单的认为是可以访问一个函数里面局部变量的另外一个函数。

scala> def m1(x:Int) = x+y
<console>:11: error: not found: value y //这里没有定义y的值
       def m1(x:Int) = x+y
                         ^

scala> var y = 10 //定义一个自由变量
y: Int = 10

scala> def m1(x:Int) = x+y //定义一个自由变量之后,方法就能够使用
m1: (x: Int)Int

这是因为我们在值函数外面声明了一个全局变量,然后值函数中的 y 捕获到了这个全局变量,从而使 x + y 变成一个正常的函数定义,让函数的定义闭合起来,这就是闭包。如果改变 y 的值,闭包也可以捕获到这个变化的 y 的值,例如让 y = 15 之后再调用值函数 m1:

scala> var y = 15
y: Int = 15

scala> def m1(x:Int) = x+y
m1: (x: Int)Int

scala> m1(10)
res0: Int = 25

这样定义的函数变量 m1 成为一个”闭包”,因为它引用到函数外面定义的变量,定义这个函数的过程是将这个自由变量捕获而构成一个封闭的函数。相当于先传递一个参数,将第一个参数传进去产生的结果当作第二次调用的函数。

闭包还可以理解为:函数的嵌套,即:在一个函数定义中,包含另外一个函数的定义;并且在内函数中可以访问外函数中的变量。

scala> def mulBy(factor:Double) = (x:Double) => x*factor
mulBy: (factor: Double)Double => Double
//第一个函数,接收一个double类型的参数,表示乘以多少倍
//第二个函数,是一个匿名函数,接收一个double类型的参数,并且内函数可以访问外函数的参数

scala> val triple = mulBy(3)
triple: Double => Double = <function1>

scala> val half = mulBy(0.5)
half: Double => Double = <function1>

scala> println(triple(10)+" "+half(8))
30.0 4.0

仁者见仁,智者见智。
节选自:
https://blog.youkuaiyun.com/u011653701/article/details/45563617
https://blog.youkuaiyun.com/bluejoe2000/article/details/51533621

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值