动态方法和参数 - 摆脱"CPS 转换尚不支持的点差"



我在Groovy Playground:中运行了以下代码

def okFn(jiraTicket, comment='') {
println "okFn: ${jiraTicket}: ${comment}"
}
def notOkFn(jiraTicket, comment='') {
println "notOkFn: ${jiraTicket}: ${comment}"
}
def branchFn(logic, successFn, successFnArgs, failureFn, failureFnArgs) {
if (logic) {
"${successFn}"(*successFnArgs)   // <==
} else {
"${failureFn}"(*failureFnArgs)   // <==
}
}
def main() {
jiraTicket = 'ABC-1234'
branchFn(1>2, 'okFn', [jiraTicket, 'successComment'], 'notOkFn', [jiraTicket, 'failureComment'])
}
main()

但在标有"<=="的代码中将始终获得"尚未支持CPS转换的价差"。我该如何摆脱它?此外,我可以具体说明哪些论点将指向哪个论点吗?例如[jiraTicket:jiraTicket, comment: 'someComment']。提前谢谢。

请注意,如果我放入"@NonCPS",branchFn将不会像预期的那样调用"okFn"/"notOkFn"。

如果你想知道我的代码在管道中是什么样子的:

node() {
stage ('blah') {
jiraTicket = 'ABC-1234'
branchFn(1>2, 'okFn', [jiraTicket, 'successComment'], 'notOkFn', [jiraTicket, 'failureComment'])
}
}
def okFn(...) {...}
def notOkFn(...) {...}
def branchFn(...) {...}

我承认这不是一个好答案,只是一个变通方法:

node() {
stage ('blah') {
jiraTicket = 'ABC-1234'
branchFn(1>2, 'okFn', [jiraTicket, 'successComment'], 'notOkFn', [jiraTicket, 'failureComment'])
}
}
def okFn(...) {...}
def notOkFn(...) {...}
@NonCPS
def callMethod(def fnName, def fnArgs) {
"${fnName}(*fnArgs)
}
def branchFn(logic, successFn, successFnArgs, failureFn, failureFnArgs) {
if (logic) {
callMethod(successFn, successFnArgs)
} else {
callMethod(failureFn, failureFnArgs)
}
}

最新更新