我理解为什么
x = 'foo'
closure={print x}
x = 'bar'
closure()
将返回' bar',因为闭包中的变量将始终引用变量的当前值。但是我想要做的是动态地构建一个闭包{print' foo'},这样当我调用闭包时,它总是打印相同的东西,基于碰巧在时间我建立了封闭。这可能吗?
答案 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'