2010-02-09 4 views
1

В коде, представленном здесь: Gant file, есть следующий код:Как Gant может ссылаться на целевые объекты по их именам, а не получать недостающее исключение свойства?

target(dist: 'Create release artefacts') { 
     depends(test) 
     depends(jar) 
} 
target(run: 'Run the distributed jar') { 
     depends(dist) 
     Ant.java(jar: distributedJarPath, fork: 'true') 
} 

target(hello: 'Hello World') { 
     println("Hello World") 
} 

setDefaultTarget(dist) 

Я заинтересован в том, что он способен писать setDefaultTarget(dist), а не получить исключение о dist как недостающее имущество. Является ли этот фрагмент оценен в контексте какого-либо объекта, а цели создают переменные экземпляра?

ответ

1

Существует два элемента, которые необходимо учитывать, привязка сценария и способ объявления цели.

Прежде всего, имеется переплет. Скрипт Groovy немного отличается от класса Groovy/Java. Скрипты Groovy допускают несвязанные переменные. Значение при компиляции скрипта переменная не обязательно должна быть объявлена. Когда компилятор увидит одну из этих необъявленных ссылок на переменные, он преобразует refrence в переменную под обложками к вызову binding.getVariable (имя переменной) (или что-то там). Таким образом, последняя строка сценария функционально эквивалентна

setDefaultTarget(binding.getVariable('dist')) 

Во-вторых, это объявление цели. Когда цель объявлена, компилятор Groovy фактически видит вызов метода: target (Map args, Closure clos) (или около него). Когда этот метод выполняется, он анализирует аргументы, извлекает имя целевого объекта и сохраняет некоторую завернутую ссылку на замыкание этим именем в привязке. Аппроксимация будет ...

target(Map args, Closure closure) { 
    binding.setVarialbe( 
    args.keySet().iterator().next(), 
    gantClosureWrapping(args, closure)) 
} 

Конечно, приведенный выше код является приблизительным, а не настоящим кодом одаренности.

так что по сути ...

target(dist: 'doc') { ... } 
// the above adds 'dist' as a variable to the binding 

//... 

setDefaultTarget(dist) 
// dist is unbound, so it is replaced with binding.getVariable('dist') 
Смежные вопросы