【问题标题】:Groovy Closure after method call [duplicate]方法调用后的 Groovy Closure [重复]
【发布时间】:2020-04-15 23:18:42
【问题描述】:

A 在 Groovy 中研究了几个小时的闭包,但还没有找到解释这种文件结构创建是如何工作的。对我来说,它看起来就像方法调用后的一些闭包。我没有看到嵌套在树对象参数上调用的第一个方法或返回的变化。

def tree = new FileTreeBuilder()
 tree.dir('src') {
    dir('main') {
       dir('groovy') {
          file('Foo.groovy', 'println "Hello"')
       }
    }

【问题讨论】:

  • 请问FileTreeBuilder是如何实现的?如果是这样:查看FileTreeBuilder 源中的methodMissing 实现;我认为这将有助于理解这个构建器。如果您要问其他问题,您能澄清一下它是什么吗?

标签: groovy closures


【解决方案1】:

这是在 Groovy 中将 Closure 作为最后一个方法的参数传递的一种可能方式。

例如这个惯用的电话:

       dir('groovy') {
          //...
       }

也可以改写为(用括号括起来):

       dir('groovy', {
          //...
       } )

或as(完全没有括号):

       dir 'groovy', {
          //...
       }

它们都是可互换的,可以根据上下文使用。

【讨论】:

  • 谢谢,我无法用谷歌搜索这个解释。
【解决方案2】:

关于如何将闭包作为参数传递给方法的变化的解释可以在Passing Closures To Methods 找到,总结如下:

闭包是我们可以分配给变量并像对象一样传递的代码块。我们可以使用闭包作为方法参数,但我们必须确保使用正确的语法。 Groovy 有一些变体,我们可以使用它来将闭包传递给方法。例如,如果闭包是方法的最后一个参数,我们可以将闭包放在参数列表之外。

您的问题是询问闭包如何出现在方法括号之外并且仍然按预期工作。将闭包作为参数传递给方法的一种变体是闭包是否是方法调用中的最后一个参数。在这种情况下,闭包可以在括号之外(参数列表):

work('Groovy') {
    assert it == 'Groovy'
}  // Last argument is closure and can be outside parenthesis.

所以在你的例子中:

def tree = new FileTreeBuilder()
 tree.dir('src') {
    dir('main') {
       dir('groovy') {
          file('Foo.groovy', 'println "Hello"')
       }
    }

tree.dir('src'){...} 的调用以及后面的闭包就是这种情况。闭包被视为方法调用tree.dir() 的最后一个参数的值,并匹配方法签名:File dir(String name, Closure cl)

【讨论】:

    猜你喜欢
    • 2013-11-15
    • 2016-05-29
    • 2018-01-22
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多