基本介绍:闭包就是一个函数和与其相关的引用环境组合的一个整体(实体),参考class中当方法跟属性 组成当闭包。
//1.用等价理解方式改写 2.对象属性理解
def minusxy(x: Int) = (y: Int) => x - y
//f 函数就是闭包.
val f = minusxy(20)
println("f(1)=" + f(1)) // 19
println("f(2)=" + f(2)) // 18
- (y:Int)=>x – y 返回的是一个匿名函数 ,因为该函数引用到到函数外的 x,那么 该函数和 x 整体形成一个闭包 如:这里 val f = minusxy(20) 的 f 函数就是闭包
- 你可以这样理解,返回函数是一个对象,而 x 就是该对象的一个字段,他们共同形成一个闭包
- 当多次调用 f 时(可以理解多次调用闭包),发现使用的是同一个 x, 所以 x 不变。
- 在使用闭包时,主要搞清楚返回函数引用了函数外的哪些变量,因为他们会组合成一个整体(实 体),形成一个闭包
/*
请编写一个程序,具体要求如下
1) 编写一个函数 makeSuffix(suffix: String) 可以接收一个文件后缀名(比如.jpg),并返回一个闭
2) 调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如.jpg) ,则返回 文件名.jpg ,
如果已经有.jpg 后缀,则返回原文件名。 3) 要求使用闭包的方式完成 String.endsWith(xx)
*/
object ParameterInfer {
def main(args: Array[String]): Unit = {
val f = makeSuffix(".jpg")
println(f("dog.jpg"))
println(f("cat"))
}
def makeSuffix(suffix: String) = {
(filename: String) => {
if (filename.endsWith(suffix)) {
filename
}
else {
filename + suffix
}
}
}
}