【问题标题】:Execution after closure property闭包属性后执行
【发布时间】:2020-01-05 12:37:14
【问题描述】:

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

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】:

    让我们稍微剖析一下并写得更明确:

    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 的返回值。

    因此,目前还不清楚您在这里真正想要什么。如果你想 打印“完成”作为运行的一部分,只需在之前打印(但随后 现在和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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 2016-04-16
      • 2020-04-15
      相关资源
      最近更新 更多