我想知道如何从与 DSL 一起使用的闭包中调用闭包。例如,让我们RestBuilder
以 Grails 的插件为例。
想象一下,我连续有几个块,例如:
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
并按照DSL中的定义进行访问。有没有办法通过设置所有者、代表等来做到这一点?toWrap
auth
contentType
RestBuilder
(注意:我在上面的示例中了解到,我可以只声明一个以 URL + 内容作为参数的函数,然后rest.post
在函数内调用。我的问题更笼统——我希望了解该语言,并且我可以更广泛地应用功能技术。)