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
您的代码有三处重要更改。
- 您定义
new Binding([:].withDefault {})
对象,其中 [:].withDefault {}
是一个映射,return 是在闭包内为任何不存在的键定义的值。在我们的例子中,我们对 return null
值使用一个空闭包,但是如果我们这样做,例如[:].withDefault { 1 }
,然后我们为 non-existing 个键创建一个 returns 1
的映射。
- 接下来,您必须调用
body.setBinding(binding)
才能使用此自定义 Binding
实例。
- 最后,您从
binding
对象而不是 body
闭包中读取值。
如何简洁地为未填充的闭包值设置默认值?
下面我认为使用可选的链接运算符可以防止抛出异常,但我仍然遇到异常。
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
您的代码有三处重要更改。
- 您定义
new Binding([:].withDefault {})
对象,其中[:].withDefault {}
是一个映射,return 是在闭包内为任何不存在的键定义的值。在我们的例子中,我们对 returnnull
值使用一个空闭包,但是如果我们这样做,例如[:].withDefault { 1 }
,然后我们为 non-existing 个键创建一个 returns1
的映射。 - 接下来,您必须调用
body.setBinding(binding)
才能使用此自定义Binding
实例。 - 最后,您从
binding
对象而不是body
闭包中读取值。