第22讲: Scala中的闭包实战详解
2016-02-13 22:04
344 查看
闭包是函数,它的返回值取决于此函数之外声明一个或多个变量的值。
假设,我们想写一个函数 f(x) ,该函数的返回值取决于变量 i 。伪代码为
在scala中,定义一个变量,必须初始化。
一旦初始化了,那么上面的函数也就不依赖于变量i了。
scala中提供了如下的写法
示例代码如下:
即函数值若想被创建必须捕获i的值,这一过程可以被理解为做对函数执行“关闭”操作,所以叫闭包。
假设,我们想写一个函数 f(x) ,该函数的返回值取决于变量 i 。伪代码为
f(x) = x + i我们尝试着写写这个函数
scala> def f(x : Int) = x + i <console>:10: error: not found: value i def f(x : Int) = x + i很明显,i 没有声明,那么能不能先声明变量i,再定义函数呢?
在scala中,定义一个变量,必须初始化。
scala> var i : Int <console>:10: error: only classes can have declared but undefined members (Note that variables need to be initialized to be defined) var i : Int
一旦初始化了,那么上面的函数也就不依赖于变量i了。
scala中提供了如下的写法
def f(x:Int) = (i : Int) => (x+i)此时函数就依赖于i,并且i的值是未知的。
示例代码如下:
object ClosureOps { def main(args: Array[String]): Unit = { def f(x:Int) = (i : Int) => (x+i) val a = f(1) val b = f(2) println(a(10)) println(b(20)) } }
即函数值若想被创建必须捕获i的值,这一过程可以被理解为做对函数执行“关闭”操作,所以叫闭包。
相关文章推荐
- 深入理解PHP之匿名函数
- Windows下Scala环境搭建
- Ruby中使用Block、Proc、lambda实现闭包
- LUA中的闭包(closure)浅析
- Lua中的闭包学习笔记
- C#中函数的创建和闭包的理解
- 深入理解javascript作用域和闭包
- javascript作用域和闭包使用详解
- 谈谈JavaScript中的函数与闭包
- 细品javascript 寻址,闭包,对象模型和相关问题
- JavaScript中的闭包原理分析
- 浅谈javascript中的闭包
- 学习javascript的闭包,原型,和匿名函数之旅
- javascript 闭包详解
- JavaScript 匿名函数和闭包介绍
- JavaScript 闭包深入理解(closure)
- 深入理解JavaScript 闭包究竟是什么
- 谈谈我对JavaScript原型和闭包系列理解(随手笔记8)
- 解决js函数闭包内存泄露问题的办法
- JavaScript中的闭包(Closure)详细介绍