Мне интересно, как вызывать замыкание из крышки, которая используется с DSL. Например, давайте возьмем плагин RestBuilder
для Grails.Groovy/Grails: Как составить закрытие без разрыва DSL
Представьте У меня есть несколько блоков в ряд, как:
rest.post("http://my.domain/url") {
auth(username, password)
contentType "text/xml"
body someContent
}
... где единственное изменение является someContent
. Периодически звонит auth
и contentType
и body
каждый раз. Так что я хотел бы сделать что-то вроде:
def oauth = [clientId: 'c', clientSecret: 's']
def withAuth(Closure toWrap) {
Closure wrapped = { it ->
auth(oauth.clientId, oauth.clientSecret)
contentType "text/xml"
toWrap.call()
}
return wrapped
}
rest.post("http://my.domain/url") (withAuth {
body someContent
})
Теперь я хотел бы wrapped
и toWrap
, чтобы иметь доступ к auth
и contentType
, как определено в RestBuilder
DSL. Есть ли способ сделать это, установив владельцев, делегатов или так далее?
(Примечание: в приведенном выше примере я понимаю, что я могу просто объявить функцию, которая принимает контент URL + в качестве аргумента, и просто вызовет rest.post
внутри функции. Мой вопрос более общий - я хочу понять языка и функциональных методов можно применять в более широком смысле)
Вероятно, установить 'делегат' будет достаточно:' toWrap.delegate = delegate; toWrap.call() ' –
Это не совсем трюк, потому что, когда он вызывается, код в' wrapped' не может видеть oauth в верхней области. – Bosh
А, я вижу, мне нужно определить 'oauth' как @Field в моем скрипте (http://stackoverflow.com/questions/6305910/how-do-we-create-and-access-the-global-variables- in-groovy) – Bosh