groovy 中的可选链接运算符未按预期工作?

Optional chaining operator in groovy not working as expected?

如何简洁地为未填充的闭包值设置默认值?

下面我认为使用可选的链接运算符可以防止抛出异常,但我仍然遇到异常。

myfunction {
    FOO="myfoo"
    BAZ="mybaz"
}

def myfunction(Closure body = {}) {
    body()

    foo = body?.FOO ?: "defaultFoo"

    // getting exception since BAR isnt defined
    bar = body?.BAR ?: "defaultBar"
    
    println("foo=" + foo + " bar=" + bar)
}

您可以通过在您的闭包上设置一个专用的 Binding 来解决它,并使用一个映射 return 作为 non-existing 键的默认值(例如 null)。

myfunction {
    FOO="myfoo"
    BAZ="mybaz"
}

def myfunction(Closure body = {}) {
    def binding = new Binding([:].withDefault {}) // <1>
    body.setBinding(binding) // <2>
    body()

    foo = binding.FOO // <3>
    bar = binding.BAR

    println("foo=" + foo + " bar=" + bar)
}

输出:

foo=myfoo bar=null

您的代码有三处重要更改。

  1. 您定义 new Binding([:].withDefault {}) 对象,其中 [:].withDefault {} 是一个映射,return 是在闭包内为任何不存在的键定义的值。在我们的例子中,我们对 return null 值使用一个空闭包,但是如果我们这样做,例如[:].withDefault { 1 },然后我们为 non-existing 个键创建一个 returns 1 的映射。
  2. 接下来,您必须调用 body.setBinding(binding) 才能使用此自定义 Binding 实例。
  3. 最后,您从 binding 对象而不是 body 闭包中读取值。