在groovy中构建闭包而不是变量本身时,是否可以引用变量的值?

时间:2016-03-16 21:38:19

标签: groovy closures

我理解为什么

x = 'foo'
closure={print x}
x = 'bar'
closure() 

将返回' bar',因为闭包中的变量将始终引用变量的当前值。但是我想要做的是动态地构建一个闭包{print' foo'},这样当我调用闭包时,它总是打印相同的东西,基于碰巧在时间我建立了封闭。这可能吗?

2 个答案:

答案 0 :(得分:1)

您可以使用方法添加间接级别,因此闭包关闭方法参数而不是外部变量

def close(x) {
    { -> println x }
}

x = 1
closure = close(x)
x = 2
closure()

或者,你可以用(可以说是不太可读的)双重闭包调用来做到这一点:

x = 1
closure = { x -> { -> println x } }(x)
x = 2
closure()

答案 1 :(得分:0)

您可以使用curry()

def x = 'foo'
def closure = { it }.curry(x)

x = 'bar'
assert closure() == 'foo'