Почему некоторые ключевые теги в Grails возвращают закрытие? Например, createLink
(see source)? Каковы преимущества или варианты использования?Почему некоторые taglib в Grails возвращают закрытие?
ответ
Итак, вы фактически видите, что 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
может незначительно измениться с течением времени, поскольку к нему добавляются улучшения или дополнения, которые, как мы надеемся, мало или вообще не влияют на его использование.
Надеюсь, это поможет немного объяснить, что вы видите и, возможно, почему.
Это свойство типа 'Closure', которое сразу получает закрытие. – cfrick
Да, но в примерах документов только возвращает неявно 'org.codehaus.groovy.grails.web.util.StreamCharBuffer', поэтому я не понимаю, зачем возвращать закрытие – iberck