内容:
1、Scala闭包解析
2、Scala闭包实战
val data = List(1, 2, 3, 4, 5, 6)
var sum = 0
data.foreach(sum += _)
闭包(除了其作用域可以继续使用它)
<span style="white-space:pre"> </span><p><span style="color:rgb(92, 92, 92);"><span style="white-space:pre"> </span>1 </span>scala> var more = <span style="color:rgb(192, 0, 0);">1</span> </p><p><span style="color:rgb(92, 92, 92);"><span style="white-space:pre"> </span>2 </span>more: Int = <span style="color:rgb(192, 0, 0);">1</span> </p><p><span style="color:rgb(92, 92, 92);"><span style="white-space:pre"> </span>3 </span>scala> val addMore = (x: Int) => x + more </p><p><span style="color:rgb(92, 92, 92);"><span style="white-space:pre"> </span>4 </span>addMore: (Int) => Int = < function> </p><p><span style="color:rgb(92, 92, 92);"><span style="white-space:pre"> </span>5 </span>scala> addMore(<span style="color:rgb(192, 0, 0);">10</span>) </p><p><span style="color:rgb(92, 92, 92);"><span style="white-space:pre"> </span>6 </span>res19: Int = <span style="color:rgb(192, 0, 0);">11</span> </p>
def add(more: Int) = (x: Int) => x + more
val a = add(1)
val b = add(9999)
println(a(10))
println(b(10))
依照这个函数文本在运行时创建的函数值(对象)被称为闭包:closure。名称源自于通过“捕获”自由变量的绑定对函数文本执行的“关闭”行动。
不带自由变量的函数文本,如(x: Int) => x + 1,被称为封闭术语:closed term,这里术语:term指的是一小部分源代码。因此依照这个函数文本在运行时创建的函数值严格意义上来讲就不是闭包,(x: Int) => x + 1在编写的时候就已经封闭了。
但任何带有自由变量的函数文本,如(x: Int) => x + more,都是开放术语:open term。因此,任何依照(x: Int) => x + more在运行期创建的函数值将必须捕获它的自由变量,more,的绑定。由于函数值是关闭这个开放术语(x: Int) => x + more的行动的最终产物,得到的函数值将包含一个指向捕获的more变量的参考,因此被称为闭包。