2016-11-22 1 views
0

Почему некоторые ключевые теги в Grails возвращают закрытие? Например, createLink (see source)? Каковы преимущества или варианты использования?Почему некоторые taglib в Grails возвращают закрытие?

+1

Это свойство типа 'Closure', которое сразу получает закрытие. – cfrick

+0

Да, но в примерах документов только возвращает неявно 'org.codehaus.groovy.grails.web.util.StreamCharBuffer', поэтому я не понимаю, зачем возвращать закрытие – iberck

ответ

3

Итак, вы фактически видите, что createLink определяется как Closure, а не то, что он возвращает Closure, когда он выполняется. Выполняется сама закрытие и делегирует реализацию, которая отвечает за фактическую работу по созданию StreamCharBuffer. Давайте посмотрим на источник и посмотреть, что происходит на самом деле:

Closure createLink = { attrs -> 
    return doCreateLink(attrs instanceof Map ? (Map) attrs : Collections.emptyMap()) 
} 

Как вы можете видеть выше, мы имеем переменную createLink типа Closure который делегирует свою работу в doCreateLink. Который оказывается защищенным методом внутри содержащего класса.

protected String doCreateLink(Map attrs) { 
    ... // actual implementation cut out of this example 
    return useJsessionId ? res.encodeURL(generatedLink) : generatedLink 
} 

Как вы можете видеть это, когда фактическая работа делается для создания StreamCharBuffer (ну, String, который бросает красиво).

Теперь, зачем вы это делаете? Один из возможных вариантов использования - метод doCreateLink гораздо более строгий, чем замыкание createLink в формальном определении. Используя метод Closure вместо метода, вызов createLink может незначительно измениться с течением времени, поскольку к нему добавляются улучшения или дополнения, которые, как мы надеемся, мало или вообще не влияют на его использование.

Надеюсь, это поможет немного объяснить, что вы видите и, возможно, почему.