Scala学习笔记(七):闭包
不带自由变量的函数字面量被称为封闭项,依照函数字面量在运行时创建的对象被称为闭包
自由变量
(x:Int) => x + more
上述代码引入一个自由变量 more,它定义在函数外面
完整示例:
scala> var more =1 more: Int = 1 scala> val addMore = (x:Int) => x + more addMore: Int => Int = <function1> scala> addMore (100) res1: Int = 101
此处函数变量 addMore 称为一个“闭包”:因为它引用函数外面定义的变量,定义这个函数的过程是将这个自由变量捕获而构成一个封闭的函数。
当自由变量发生变化时,Scala 的闭包能够捕获到这个变化,因为 Scala 的闭包捕获的是变量本身而不是当时变量的值。
scala> more = 9999 more: Int = 9999 scala> addMore ( 10) res2: Int = 10009
同样,如果变量在闭包发生变化,也会反映到函数外面定义的变量
scala> val numbers = List ( -11, -10, -5, 0, 5, 10) numbers: List[Int] = List(-11, -10, -5, 0, 5, 10) scala> var sum =0 sum: Int = 0 scala> numbers.foreach(sum += _)
scala> sum
res4: Int = -11
一个闭包如果使用了一个函数的参数,然后该函数被多次调用,那么闭包所引用的变量为定义该闭包时变量的值
scala> def makeIncreaser(more: Int) = (x: Int) => x + more makeIncreaser: (more: Int)Int => Int scala> val inc1=makeIncreaser(1) inc1: Int => Int = <function1> scala> val inc9999=makeIncreaser(9999) inc9999: Int => Int = <function1> scala> inc1(10) res5: Int = 11 scala> inc9999(10) res6: Int = 10009
定义闭包时相当于保存了当时程序状态的一个快照
调用 makeIncreaser(1) 时所创建闭包引用的 more 的值为 1,而调用 makeIncreaser(9999) 时所创建闭包引用的 more 的值为 9999。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?