0

我正在编写一个包含许多全局属性和闭包的大型 Groovy 脚本。所有闭包都用于向现有类添加新方法,例如:

myProperty = 'foo'
// ...more script code...

class MyClass {
    def myProperty = 'default'
}
// ...more script code...

MyClass.metaClass.evaluate = { ->
    myProperty = 'bar'
}

def mc = new MyClass()
mc.evaluate()
println mc.myProperty // prints out "default" instead of "bar"

我的意图是让闭包myProperty引用委托类myProperty而不是全局类。我找到了几种方法来解决这个问题:

delegate1)在闭包内显式取消引用:

MyClass.metaClass.evaluate = { ->
    delegate.myProperty = 'bar'
}

def mc = new MyClass()
mc.evaluate()
println mc.myProperty // prints out "bar" as desired

2)将闭包的解析策略设置为DELEGATE_ONLY:

def evalClosure = { ->
    myProperty = 'bar'
}
evalClosure.resolveStrategy = Closure.DELEGATE_ONLY
MyClass.metaClass.evaluate = evalClosure

def mc = new MyClass()
mc.evaluate()
println mc.myProperty // prints out "bar" as desired

我更愿意使用方法#2 来避免在我的闭包中到处都有“委托”,但我不喜欢为我创建的每个闭包设置解决策略。

我如何告诉 Groovy 默认对所有闭包使用 DELEGATE_ONLY 解析策略?这甚至可能吗?

4

1 回答 1

1

据我所知,我无法更改默认的委派策略,您有两个选项:

  1. 将您的脚本拆分为类(因此您的脚本级别myProperty和类级别不在myProperty同一范围内)

  2. 编写一个方法来更改resolveStrategy并在设置时调用它metaClass,即:

    def only( Closure c ) {
      c.resolveStrategy = Closure.DELEGATE_ONLY
      c
    }
    
    MyClass.metaClass.evaluate = only { ->
        myProperty = 'bar'
    }
    
于 2013-06-25T07:48:25.120 回答