闭包后执行属性

问题描述 投票:0回答:1

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

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

groovy closures dsl
1个回答
2
投票

让我们对此进行一点分析,并写得更明确:

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,因为空值是println的返回值。

因此,目前尚不清楚您在这里真正想要的是什么。如果你想要在运行中打印“完成”,只需先打印(但随后现在与println "run...相同。或者你把它在闭包中,但是它与println "then...相同。

所以我假设您要链接这些呼叫。在这种情况下,每个关闭必须返回一些要与之关联的东西。例如:

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

run "123" then "456" done "789"
© www.soinside.com 2019 - 2024. All rights reserved.