groovy 闭包上下文传递
时间: 2023-07-05 20:14:11 浏览: 79
在Groovy中,闭包可以捕获其定义时所在的上下文,并在运行时使用这些上下文中的变量和方法。当一个闭包被调用时,它的上下文可以通过多种方式传递给它。
一种传递上下文的方式是将其作为闭包的参数传递。例如:
```
def myClosure = { context ->
println "Hello, ${context.user}!"
}
myClosure([user: 'John'])
```
在这个例子中,我们定义了一个闭包 `myClosure`,它接受一个名为 `context` 的参数,在闭包体中打印出 `context.user` 的值。我们将一个包含 `user` 属性的map作为参数传递给这个闭包。
另一种传递上下文的方式是使用闭包的 `delegate` 属性。例如:
```
def data = [name: 'John', age: 30]
def myClosure = {
println "Hello, ${name}! You are ${age} years old."
}
myClosure.delegate = data
myClosure()
```
在这个例子中,我们定义了一个闭包 `myClosure`,它引用了 `name` 和 `age` 变量。然后我们将一个包含 `name` 和 `age` 属性的map赋值给闭包的 `delegate` 属性。当我们调用闭包时,它将在 `delegate` 对象上查找 `name` 和 `age` 属性,并将它们的值打印出来。
还有一种传递上下文的方式是使用闭包的 `resolveStrategy` 属性。这个属性可以控制闭包在查找变量和方法时的行为。默认情况下,它是 `Closure.DELEGATE_FIRST`,即先在 `delegate` 对象上查找,如果找不到再在闭包定义时的上下文中查找。例如:
```
def data = [name: 'John', age: 30]
def myClosure = {
println "Hello, ${name}! You are ${age} years old."
}
myClosure.resolveStrategy = Closure.DELEGATE_FIRST
myClosure.delegate = data
myClosure()
```
在这个例子中,我们将闭包的 `resolveStrategy` 属性设置为 `Closure.DELEGATE_FIRST`,然后将一个包含 `name` 和 `age` 属性的map赋值给闭包的 `delegate` 属性。当我们调用闭包时,它将先在 `delegate` 对象上查找 `name` 和 `age` 属性,如果找不到再在闭包定义时的上下文中查找。
阅读全文