柯里化是一個看起來比較費解的名字,特意到wiki上找了一下,這是它的定義:在計算機(jī)科學(xué)中,柯里化(英語:Currying)呜象,又譯為卡瑞化或加里化,是把接受多個參數(shù)的函數(shù)變換成接受一個單一參數(shù)(最初函數(shù)的第一個參數(shù))的函數(shù)碑隆,并且返回接受余下的參數(shù)而且返回結(jié)果的新函數(shù)的技術(shù)恭陡。這個技術(shù)由Christopher Strachey以邏輯學(xué)家哈斯凱爾·加里命名的,盡管它是Moses Sch?nfinkel和戈特洛布·弗雷格發(fā)明的上煤。
不過我們可以通過簡單的事例來輕易理解它休玩。先一句話概括就是:先給閉包綁定一些參數(shù),每次綁定之后劫狠,在綁定完成的對象看來拴疤,這個參數(shù)就是不需要傳遞的參數(shù)了,用戶只需要傳遞剩余的參數(shù)過來就可以独泞。
示例如下:
1呐矾、先定義一個函數(shù),參數(shù)是一個閉包:
def printFavorite(Closure closure){
def curryobj = closure.curry("小明","浙江杭州",30)
def rcurryobj = closure.rcurry("浙江-杭州",30,"大河戀")
def ncurryobj = closure.ncurry(2,30).ncurry(1, "浙江杭州").ncurry(0, "小明")
curryobj "戰(zhàn)爭與和平"
curryobj "三國演義"
curryobj "紅與黑"
curryobj "傾城之戀"
rcurryobj "小明"
ncurryobj "楚門的世界 "
}
2懦砂、接下來是閉包定義
def bibao = {name,address,age,book->
println "名字:$name 地址:$address 年齡:$age 書名:$book"
}
3凫佛、調(diào)用語句
printFavorite(bibao)
結(jié)果:
名字:小明 地址:浙江杭州 年齡:30 書名:戰(zhàn)爭與和平
名字:小明 地址:浙江杭州 年齡:30 書名:三國演義
名字:小明 地址:浙江杭州 年齡:30 書名:紅與黑
名字:小明 地址:浙江杭州 年齡:30 書名:傾城之戀
名字:小明 地址:浙江-杭州 年齡:30 書名:大河戀
名字:小明 地址:浙江杭州 年齡:30 書名:楚門的世界
總結(jié)下:閉包調(diào)用curry方法之后,可以按照順序來綁定參數(shù)孕惜,獲得一個柯里化對象,之后調(diào)用這個柯里化對象就可以不用傳入這個參數(shù)了晨炕。細(xì)心的同學(xué)應(yīng)該還可以看到衫画,這里groovy還提供了倒序柯里化的方法rcurry,以及指定位置柯里化的ncurry方法,只要跑幾個例子就可以明白瓮栗,不在贅述了削罩。