gpt4 book ai didi

Groovy 闭包解释

转载 作者:行者123 更新时间:2023-12-04 20:11:13 25 4
gpt4 key购买 nike

我熟悉像这样的普通 groovy 闭包

def printSum = {a,b ->
println a+b
}

printSum(5,7) // 12

但是,我遇到了 SpringWS 插件中的代码,我很难理解:
def withEndpointRequest = { url, payload ->
def writer = new StringWriter()
def request = new MarkupBuilder(writer)
payload.delegate = request
payload.call()
def webServiceTemplate = new WebServiceTemplate()

def response = webServiceTemplate.sendToEndpoint(url, writer.toString())
new XmlSlurper().parseText(response)
}

我知道上面是一个闭包。

它是这样使用的:
    def namespace = "http://www.myveryimportantcompany.com/hr/schemas"
def serviceURL = "http://localhost:8080/myapp/services"
def response = withEndpointRequest(serviceURL) {
HolidayRequest(xmlns: namespace) {
Holiday {
StartDate("2006-07-03")
EndDate("2006-07-07")
}
Employee {
Number("42")
FirstName("Russ")
LastName("Miles")
}
}
}

如果 serviceURL正在传入那么有效载荷在哪里?

有人可以详细解释一下这个片段吗?

最佳答案

在上面的实现中,withEndpointRequest是一个接受两个参数的闭包。
withEndpointRequest(String serviceUrl, Closure payload) .

当您使用时 withEndpointRequest从你的客户那里,你实际上是在做

    def namespace = "http://www.myveryimportantcompany.com/hr/schemas"
def serviceURL = "http://localhost:8080/myapp/services"
def payload = {
HolidayRequest(xmlns: namespace) {
Holiday {
StartDate("2006-07-03")
EndDate("2006-07-07")
}
Employee {
Number("42")
FirstName("Russ")
LastName("Miles")
}
}
}
def response = withEndpointRequest(serviceURL, payload)

通过声明与 withEndpointRequest 内联的闭包,上述内容变得更加简洁。 .
上面也可以写成
def response = withEndpointRequest(serviceURL, {
//payload goes here as an inline closure as the second parameter
HolidayRequest(xmlns: namespace) {
Holiday {
StartDate("2006-07-03")
EndDate("2006-07-07")
}
Employee {
Number("42")
FirstName("Russ")
LastName("Miles")
}
}
})

这是不那么冗长。最后,它可以通过编写为
def response = withEndpointRequest(serviceURL) {
HolidayRequest(xmlns: namespace) {
Holiday {
StartDate("2006-07-03")
EndDate("2006-07-07")
}
Employee {
Number("42")
FirstName("Russ")
LastName("Miles")
}
}
}

这里要注意的一点是 Closure payload是最后一个参数。

现在,请注意闭包( payload )直到 payload.call() 才会被调用按照您在 SpringWS 插件中的问题中提到的方式调用。

看看 Closures as Method Arguments .

我希望我能够传达你想要理解的东西。 :)

关于Groovy 闭包解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17073661/

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