Область видимости переменной в Groovy Closure (глобальная переменная и параметр функции имеют одно и то же имя) - PullRequest
0 голосов
/ 22 мая 2018

Я новичок в Groovy и запутался в области видимости переменных в замыкании.

Например, приведенный ниже код работает нормально.Он печатает два 5.

def x = 10
def y = 25

def myfunc(x) {
  return {
      println(x)
      insideFunc(x)
  }
}

def insideFunc(x) {
    println(x)
}

closureFunc = myfunc(5)

closureFunc.call()

Но приведенный ниже код будет отображать ошибку: groovy.lang.MissingPropertyException: Нет такого свойства: x для класса.Зачем?Я думал, что insideFunc может получить доступ к глобальной переменной 'x'?

def x = 10
def y = 25

def myfunc(x) {
  return {
      println(x)
      insideFunc()
  }
}

def insideFunc() {
    println(x)
}

closureFunc = myfunc(5)

closureFunc.call()

1 Ответ

0 голосов
/ 22 мая 2018

Проблема со вторым скриптом связана с тем, как он выполняется.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)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...