Проблема со вторым скриптом связана с тем, как он выполняется.x
локально ограничен в методе run
.Это должно стать очевидным, если взглянуть на то, во что превращается скрипт, когда он выполняется.Из groovyConsole следующее «Inspect AST» отображает (это не полностью):
public class script1526974299557 extends groovy.lang.Script {
...
public java.lang.Object run() {
java.lang.Object x = 10
java.lang.Object y = 25
closureFunc = this.myfunc(5)
closureFunc.call()
}
public java.lang.Object myfunc(java.lang.Object x) {
return {
this.println(x)
this.insideFunc()
}
}
public java.lang.Object insideFunc() {
this.println(x)
}
}
Очевидно, что x
выходит за рамки insideFunc()
.
Относительно первогоВерсия, однако, все выглядит иначе.Поскольку insideFunc()
принимает параметр, его аргумент переносится закрытием:
public class script1526974614817 extends groovy.lang.Script {
...
public java.lang.Object myfunc(java.lang.Object x) {
return {
this.println(x)
this.insideFunc(x)
}
}
public java.lang.Object insideFunc(java.lang.Object x) {
this.println(x)
}
}