您定义的闭包不会在binding
对象中存储任何内容 - 它只是返回作为str
变量传递的字符串,重复 4 次。
此对象存储所有未指定类型或使用关键字binding
定义的变量。def
它是通过 Groovy 元编程功能(getProperty
以及setProperty
更具体的方法)完成的。因此,当您定义s
如下变量时:
def clsr = {
s = str*4
return s
}
然后这个闭包将创建一个绑定,其中键s
和值从表达式评估str * 4
。这个绑定对象只不过是一个通过getProperty
andsetProperty
方法访问的映射。因此,当 Groovy 执行时s = str * 4
,它会调用,因为未定义setProperty('s', str * 4)
变量/属性。s
如果我们做一个稍微简单的改变,比如:
def clsr = {
def s = str*4 // or String s = str * 4
return s
}
那么绑定s
将不会被创建,因为setProperty
方法不会被执行。
对您的示例的另一条评论。如果要查看绑定对象中的任何内容,则需要调用返回的闭包。在上面显示的示例中,闭包被返回,但它永远不会被调用。如果你这样做:
def c = fourtify("aa")
c.call()
println("binding variables: ${c.getBinding().getVariables()}")
然后你的闭包被调用并且绑定对象将包含绑定(如果有的话)。现在,如果您将示例修改为以下内容:
def fourtify(String str) {
def clsr = {
def n = 4 // it does not get stored as binding
s = str * n
return s
}
return clsr
}
def c = fourtify("aa")
c.call()
println("binding variables: ${c.getBinding().getVariables()}")
您将看到以下输出作为回报:
binding variables: [args:[], s:aaaaaaaa]
希望能帮助到你。