如何在Groovy中柯里化闭包以实现cp src dest式调用?
实现Groovy中
cp src dest风格的调用 其实实现你想要的调用方式很简单,甚至不需要复杂的操作,我们一步步来看:
首先,先还原你已经写好的代码(补全Java方法的示例逻辑方便测试):
// 示例Java方法实现 void copy(Object src, Object dest) { println "Copying content from $src to $dest" } def copyGroovy = { p1, p2 -> copy(p1,p2) } def copyFixP1 = { p1 -> copyGroovy.curry(p1) }
方案1:最直接的实现(仅支持cp src dest)
如果你只是想让cp可以像cp src dest这样直接传两个参数调用,那直接把cp指向你已经定义好的copyGroovy闭包就行——Groovy里闭包调用允许省略括号,天然支持这种简洁写法:
def cp = copyGroovy // 现在就能这样调用啦: cp "mySourceFile.txt" "myDestFile.txt"
方案2:支持灵活调用(直接传参+部分应用)
如果你还希望cp能支持部分应用(比如先绑定源参数,得到一个只需要目标参数的闭包),同时保留cp src dest的调用形式,那可以写一个能处理不同参数个数的闭包:
def cp = { Object... args -> switch(args.length) { case 2: copy(args[0], args[1]) break case 1: // 返回绑定了第一个参数的闭包,后续只需传入目标参数 return { dest -> copy(args[0], dest) } default: throw new IllegalArgumentException("cp 需要传入1或2个参数") } } // 两种调用方式都能用: // 1. 直接传两个参数 cp "source1.txt" "dest1.txt" // 2. 先绑定源参数,再传目标参数 def cpSource2 = cp "source2.txt" cpSource2 "dest2.txt"
这种方式兼顾了两种使用场景,完全符合Groovy灵活的函数式编程特性~
内容的提问来源于stack exchange,提问作者SharePoint Newbie
相关产品推荐
相关产品推荐

