关闭后执行 属性

Execution after closure property

我想在分支到这样的闭包后立即执行代码:

def run(String s) {
    println "run ${s}"
    ["then": { input ->
        println "then ${input}"
    }]
    //println "Done"
}

run "123" then "456"

这按预期工作,但如果我想 运行 在关闭后立即编写一些代码怎么办?

F.i。如果我取消注释行 println "Done" 我得到一个 NullPointerException.

我有点理解为什么会这样,不过有什么办法吗?

编辑 多亏了 cfrick,这就是我想做的,现在可以了;

result = ["then": { input...
// Do my stuff here
return result

让我们稍微剖析一下,把它写得更明确:

def run(String s) {
    println "run ${s}"
    return ["then": { input -> println "then ${input}" }]
}

run("123").then("456")

因此,如果我们取消注释 println,这将更改为:

def run(String s) {
    println "run ${s}"
    // this now is just a no-op
    ["then": { input -> println "then ${input}" }]
    return println("Done")
}

您得到 NPE,因为 null 是 println 的 return 值。

所以目前还不清楚您真正想要的是什么。如果你想 要打印 "Done" 作为 运行 的一部分,只需在之前打印它(但随后 现在和 println "run... 一样。或者你把它 在闭包内部,但它与 println "then....

相同

所以我假设您想链接这些调用。在那种情况下,每个关闭 必须 return 可以链接的东西。例如

def run(String s) {
    println "run ${s}"
    return [then: { 
        println "then ${it}"
        return [done: { println "done $it" }]
    }]
}

run "123" then "456" done "789"