gpt4 book ai didi

gradle - 从闭包访问局部变量

转载 作者:行者123 更新时间:2023-12-03 03:47:19 25 4
gpt4 key购买 nike

我正在尝试做这样的事情

def myFunc(Closure config) {
def var1
def var2

config()

println var1, var2
}

myFunc {
var1 = "hello"
var2 = "world"
}

有没有办法使这项工作?代表仅适用于类字段,不适用于本地变量。

最佳答案

Groovy 脚本在读取给定属性的值时会做一件事——当它存在于当前范围(局部变量、对象的字段等)时,它使用它的值,否则它引用 binding。包含所有不是变量、字段等的绑定(bind)的对象。

在您的情况下会发生以下情况:

myFunc {
var1 = "hello"
var2 = "world"
}

当这个闭包被执行时,它会添加 var1var2binding具有相应的值。当 myFunc被执行:
def myFunc(Closure config) {
def var1
def var2

config()

println var1
println var2
}

它不使用 binding读取 var1 的值和 var2 ,因为在当前范围内,两个变量都存在,这就是为什么
null
null

被打印出来。

但如果你改变阅读方式 var1var2config() 之后像这样:
def myFunc(Closure config) {
def var1
def var2

config()

println binding.getVariable("var1") ?: var1
println binding.getVariable("var2") ?: var2
}

您将明确检查 config()已添加 var1var2binding如果为真,您将读取已执行的闭包修改的值。否则,您将读取 var1 的本地默认值和 var2 .
hello
world

这类似于从 myFunc 中删除局部变量。并调用像这样的闭包:
def myFunc(Closure config) {
config()

println var1
println var2
}

但在这种情况下,您指的是 binding只有并且没有地方变量参与该过程。我猜你必须处理现有的局部变量,你不能只删除它们——在这种情况下,要明确阅读 binding或局部变量是处理它的最佳方法。

Gradle 案例

如果在 build.gradle 中遇到这种情况脚本,您可以使用一种流行的方法来使用映射对象委托(delegate),因此闭包内使用的所有变量都会自动分配为映射属性。考虑以下示例:
def myFunc(Closure config) {
def var1
def var2

def map = [:]
config.delegate = map
config.resolveStrategy = Closure.DELEGATE_FIRST
config()

println map.getOrDefault('var1', var1)
println map.getOrDefault('var2', var2)
}

task hello {
doLast {
myFunc {
var1 = "hello"
var2 = "world"
}
}
}

在这种情况下运行 myFunc给定的闭包以分配 var1 结束和 var2委托(delegate) map 对象的属性。它让我们有机会使用 map.getOrDefault(key,default)方法来检索使用闭包设置的值或使用默认的局部变量值。

关于gradle - 从闭包访问局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51365486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com