Это пример кода DSL (домена). В Groovy многие DSL реализованы как код Groovy, хотя иногда это может выглядеть довольно забавно. Этот блок кода выполняется как Groovy кода, и это более ясно, что это код, если вы добавите в опущенных необязательных скобках:
grails({
views({
gsp({
encoding = 'UTF-8'
// ...
})
})
})
и более, если мы заменим набор свойство вызов эквивалентного вызова метода
grails({
views({
gsp({
setEncoding('UTF-8')
// ...
})
})
})
Если вы запустили это в консоли или как часть другого кода Groovy или в приложении Grails, это не получится, потому что метод grails не принимает замыкание в качестве аргумента или аналогичные «представления» или «gsp» ', и нет метода setEncoding(String)
. Но при запуске как DSL-кода часто код запускается внутри замыкания, delegate
устанавливается в класс-помощник DSL, который обрабатывает вызовы methodMissing
и propertyMissing
.
Этот помощник рассматривает имя метода и число и/или типы аргументов метода (или имя свойства и тип значения), и если они действительны для DSL, он выполняет соответствующую работу, иначе он выдает MissingMethodException
/MissingPropertyException
, или исключение, связанное с DSL, или обрабатывает проблему другим способом.
В этом случае есть обработчик DSL конфигурации, который переводит эти вызовы методов в вызовы свойств конфигурации.
Есть еще несколько DSL-интерфейсов, которые используются в приложении Grails, которые работают одинаково. mapping
и ограничение blocks in domain classes, the
grails.project.dependency.resolution block in
BuildConfig.groovy` и т.д. Все оценивается как Groovy кода, и пропавший метод/свойство вызовов настройки Горм отображения, определение ограничений, зависимости плагин и т.д.
Programming Groovy 2 - особенно хорошая книга Groovy для изучения DSL.
Это вызовы методов. –
на каком объекте? – sethmuss
Nevermind. Это достаточно информации для меня, чтобы понять, что происходит. Спасибо Oliver – sethmuss