2014-12-06 5 views
2

Я начинаю изучать grails, и есть какой-то отличный синтаксис, который я вообще не получаю, и до сих пор не имеет документов, поскольку я не знаю, как это называется.Синтаксис Groovy с именем block?

Что такое «grails», «views» и «gsp» в коде ниже?

grails { 
     views { 
     gsp { 
      encoding = 'UTF-8' 
      // ... 
     } 
     } 
    } 

Спасибо! стр. Я чувствую себя идиотом за то, что не смог понять это ...

+1

Это вызовы методов. –

+0

на каком объекте? – sethmuss

+0

Nevermind. Это достаточно информации для меня, чтобы понять, что происходит. Спасибо Oliver – sethmuss

ответ

6

Это пример кода 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.

+0

Спасибо, Берт! – sethmuss

Смежные вопросы