柯里化是一个看起来比较费解的名字,特意到wiki上找了一下,这是它的定义:在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。这个技术由Christopher Strachey以逻辑学家哈斯凯尔·加里命名的,尽管它是Moses Schönfinkel和戈特洛布·弗雷格发明的。
不过我们可以通过简单的事例来轻易理解它。先一句话概括就是:先给闭包绑定一些参数,每次绑定之后,在绑定完成的对象看来,这个参数就是不需要传递的参数了,用户只需要传递剩余的参数过来就可以。
示例如下:
1、先定义一个函数,参数是一个闭包:
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 "战争与和平"
curryobj "三国演义"
curryobj "红与黑"
curryobj "倾城之恋"
rcurryobj "小明"
ncurryobj "楚门的世界 "
}
2、接下来是闭包定义
def bibao = {name,address,age,book->
println "名字:$name 地址:$address 年龄:$age 书名:$book"
}
3、调用语句
printFavorite(bibao)
结果:
名字:小明 地址:浙江杭州 年龄:30 书名:战争与和平
名字:小明 地址:浙江杭州 年龄:30 书名:三国演义
名字:小明 地址:浙江杭州 年龄:30 书名:红与黑
名字:小明 地址:浙江杭州 年龄:30 书名:倾城之恋
名字:小明 地址:浙江-杭州 年龄:30 书名:大河恋
名字:小明 地址:浙江杭州 年龄:30 书名:楚门的世界
总结下:闭包调用curry方法之后,可以按照顺序来绑定参数,获得一个柯里化对象,之后调用这个柯里化对象就可以不用传入这个参数了。细心的同学应该还可以看到,这里groovy还提供了倒序柯里化的方法rcurry,以及指定位置柯里化的ncurry方法,只要跑几个例子就可以明白,不在赘述了。
网友评论