Scala編程之閉包(closure)
阿新 • • 發佈:2019-05-13
多次 code pri 需要 功能 lan 要求 min dsw 一、概念
如:這裏val f= minusxy(20)的f函數就是閉包
2)你可以這樣理解,返回函數是一個對象,而x就是該對象的一個字段,他們共同形成一個閉包
3)當多次調用f時(可以理解多次調用閉包),發現使用的是同一個x,所以ⅹ不變
4)在使用閉包時,主要搞清楚返回函數引用了函數外的哪些變量,因為他們會組合成一個整體(實體),形成一個閉包
閉包:我們把一個函數與其相關引用環境(變量)組合成一個整體叫做閉包
概念晦澀難懂,下面我們用一個例子說明
二、小例子
def minusxy(x:Int) = (y:Int)=>x-y
val f=minusxy(20)
println("f(1)="+f(1))//19
println("f(2)="+f(2))//18
minusxy中x是匿名函數外部變量,但是卻被用在匿名函數的裏面,就像關在匿名函數裏面一樣,所以我們把一個函數與其相關引用環境(變量)組合成一個整體叫做閉包
解釋:
1) (y: Int)=>x-y
返回的是一個匿名函數,因為該函數引用到到函數外的x,那麽該函數和x整體形成一個閉包
2)你可以這樣理解,返回函數是一個對象,而x就是該對象的一個字段,他們共同形成一個閉包
3)當多次調用f時(可以理解多次調用閉包),發現使用的是同一個x,所以ⅹ不變
4)在使用閉包時,主要搞清楚返回函數引用了函數外的哪些變量,因為他們會組合成一個整體(實體),形成一個閉包
相信你通過上面那個例子已經有所理解了,那麽試試下面這個需求把
三、練練手
1)編寫一個函數 makeSuffix(suffix: String)可以接收一個文件後綴名(比如.jpg),並返回一個閉包(closure)
2)調用閉包,可以傳入一個文件名
如果該文件名沒有指定的後綴(比如.jpg),則返回文件名.jpg。 文件名是 dog =》dog.jpg
如果已經有.jpg後綴,則返回原文件名。 文件名是cat.jpg => cat.jpg
3)要求使用閉包的方式完成
提示:String.endsWith(xx)
=========假裝有條分割線=============
object ClosureDemo { def main(args: Array[String]): Unit = { val f=makeSuffix(".jpg") println(f("cat")) println(f("dog.jpg")) } /** * 閉包 * @param suffix 變量 * @return */ def makeSuffix(suffix:String)=(fileName:String)=>{if (fileName.endsWith(suffix)) fileName else fileName+suffix} }
四、閉包的好處
通過上邊那個小練習我們知道,如果使用傳統的方法,也可以輕松實現這個功能,但是傳統方法需要每次都傳入後綴名,比如.jpg,而閉包因為可以保留上次引用的某個值,所以我們傳入一次就可以反復使用。
Scala編程之閉包(closure)