闭包
在Scala中,可以在任何作用域内定义函数、包、类甚至是另一个函数或方法。在函数体内,你可以访问到相应作用域内的任何变量。函数可以在变量不再处于作用域内时被调用。
def closePackage: Unit = {
def mulBy(factor: Double) = (x: Double) => factor * x
/*
mulBy的首次调用将参数变量factor设为3,。该变量在(x:Double)=>factor * x函数
的函数体内被引用。该函数被存入triple.然后参数变量factor从运行时的栈上被弹出。
*/
val triple = mulBy(3)
/*
mulBy再次被调用,这次factor被设为0.5.该变量在(x:Double)=>factor * x函数的
函数体内被引用,该函数被存入half.
*/
val half = mulBy(0.5)
//每一个函数被称为闭包,由代码和代码用到的任何非局部变量定义构成
println(triple(14) + " " + half(14)) //42, 7
}
柯里化
柯里化指的是将原来接受2个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数作为参数的函数。
def curryingFunction = {
def totalSum(x: Int, y: Int) = x + y
println("原始:" + totalSum(4, 5))
//变为了两个函数连续调用的形式,以下函数接受一个参数,生成另一个接受单个参数的函数
def totalSumAtTime(x: Int) = (y: Int) => x + y
println("柯里化:" + totalSumAtTime(4)(5))
}