Переопределите существующие свойства с помощью Groovy DSL-делегата getter. - PullRequest
1 голос
/ 16 февраля 2020

В приведенном ниже примере я хочу переопределить все свойства с помощью логина моего собственного делегата c. Но я могу сделать это только для несуществующих свойств, те, которые известны во время компиляции, остаются прежними.

Можно ли обработать их все?

def dsl(Closure action) {
    action.delegate = new Object() {
        Object getProperty(String name) {
            println "overriding property [$name] => Ross"
            return "Ross"
        }
    }
    action()
}

dsl {
    def existingSymbol = "Joe"
    println "existingSymbol: $existingSymbol"
    println "inexistentSymbol: $inexistentSymbol"
}

Вывод:

existingSymbol: Joe     <--- expecting "Ross" here
overriding property [inexistentSymbol] => Ross
inexistentSymbol: Ross

1 Ответ

0 голосов
/ 17 февраля 2020

проблема в def existingSymbol = "Joe"

с помощью def вы объявляете новую локальную переменную с максимальным приоритетом.

проверьте следующий код:

def dsl(Closure action) {
    def delegate = new Object() {
        Object getProperty(String name) {
            return "Ross"
        }
    }
    action=action.rehydrate(delegate,delegate,delegate)
    action.call()
}

dsl {
    def existingSymbol = "Joe"
    println "1 existingSymbol: ${existingSymbol}"
    println "2 existingSymbol: ${this.existingSymbol}"
}
dsl {
    existingSymbol = "Joe"
    println "3 existingSymbol: ${existingSymbol}"
    println "4 existingSymbol: ${this.existingSymbol}"
}

вывод:

1 existingSymbol: Joe
2 existingSymbol: Ross
3 existingSymbol: Ross
4 existingSymbol: Ross
...