gpt4 book ai didi

grails - 常规/Grails : How to compose closures without breaking DSL

转载 作者:行者123 更新时间:2023-12-02 13:47:10 25 4
gpt4 key购买 nike

我想知道如何从与 DSL 一起使用的闭包中调用闭包。例如,让我们以 Grails 的 RestBuilder 插件为例。

假设我有几个连续的 block ,例如:

rest.post("http://my.domain/url") {
auth(username, password)
contentType "text/xml"
body someContent
}

...唯一改变的是someContent。每次调用 authcontentTypebody 都会重复。所以我想做类似的事情:

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
})

现在,我希望 wrappedtoWrap 能够访问 authcontentType 中定义的RestBuilder DSL。有没有一种方法可以通过设置所有者、委托(delegate)人等来实现?

(注意:我在上面的示例中了解到,我可以只声明一个将 URL + 内容作为参数的函数,然后在函数内调用 rest.post。我的问题更笼统-- 我希望了解这门语言,并且对于我可以更广泛应用的功能技术。)

最佳答案

感谢@igor-artamonov,我有以下工作方法。请注意,我将 withAuth 从函数更改为闭包,这样它就可以访问脚本级状态,而无需在脚本上声明 @Field 变量。

def oauth = [clientId: 'c', clientSecret: 's']

def withAuth { Closure toWrap ->
return {
auth(oauth.clientId, oauth.clientSecret)
contentType "text/xml"
toWrap.delegate = delegate
toWrap.call()
}
}

rest.post("http://my.domain/url", withAuth {
body someContent
})

关于grails - 常规/Grails : How to compose closures without breaking DSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18456759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com