Groovy 如何将布尔值传递给具有变量名的方法
我有这样的方法Groovy 如何将布尔值传递给具有变量名的方法,groovy,Groovy,我有这样的方法 def uploadFile(String fileName, boolean performCleanup = false) { //upload file if (performCleanup == true) { //delete local file } } 我用两种方式调用此方法: uploadFile(“/some/path/to/file.txt”) uploadFile(“/some/path/to/file.txt”,true)
def uploadFile(String fileName, boolean performCleanup = false) {
//upload file
if (performCleanup == true) {
//delete local file
}
}
我用两种方式调用此方法:
uploadFile(“/some/path/to/file.txt”)
uploadFile(“/some/path/to/file.txt”,true)
true
的意义
类似于,uploadFile(“/some/path/to/file.txt”,performCleanup:true”)
这可能吗?您可以使用
映射来模拟命名参数:
def uploadFile(Map args) {
String fileName = args.fileName
// will default to false if omitted
boolean performCleanup = args.performCleanup
//upload file
if (performCleanup == true) {
//delete local file
}
}
然后可以使用
uploadFile(fileName: "/some/path/to/file.txt")
uploadFile(fileName: "/some/path/to/file.txt", performCleanup: true)
与更典型的样式(其中每个值作为单独的参数传递)相比,此样式有一些优点和缺点:
- 提高了呼叫站点的可读性
- 声明站点可读性降低
- 灵活性,例如,您可以向方法添加/删除参数,而无需更新每个调用方
- 编译时安全性降低,例如,即使启用了静态编译,也无法判断每个调用方是否提供了所需的参数
通过引入和额外的闭包,您可以创建一个可读性良好的微型DSL:
def performCleanup = {
println "cleanup $it" //delete local file
}
def upload(fileName) {
println "upload file $fileName" //upload file
[then: { action ->
action(fileName)
}]
}
upload "path"
upload "path" then performCleanup
我想建议以DSL方式使用它的另一种方法,返回一个可以响应performCleanup
:
def uploadFile(String fileName) {
//upload file
println "uploading file"
[performCleanup: {
//delete local file
println "cleaning up"
}]
}
uploadFile 'file' performCleanup()
输出:
$ groovy Clean.groovy
uploading file
cleaning up
$ groovy Clean.groovy
uploading file
如果不在之后调用performCleanup()
,则不会发生以下情况:
uploadFile 'file'
输出:
$ groovy Clean.groovy
uploading file
cleaning up
$ groovy Clean.groovy
uploading file
也许这篇文章会有帮助。