Groovy中的花括号语法是什么意思?

14

这个语法在 Groovy 中是什么意思?

class CreateMessagePage extends Page {
    static at = { assert title == 'Messages : Create'; true }
    static url = 'messages/form'
    static content =  {
        submit { $('input[type=submit]') }
        MyVeryStrangeForm { $('form') }
        errors(required:false) { $('label.error, .alert-error')?.text() }
    }
}

(摘自Spring MVC Test HtmlUnit手册

问题涉及Groovy语言,我想用Groovy术语了解答案。

content是什么?它是一个静态变量吗?它的名称是随机的还是基类Page预定义的?

=(等号)后面是什么?它是一个赋值运算符吗?

=右侧是什么?这是一个闭包吗?或者这是一个匿名类吗?或者这两者是相同的?

花括号内的submit是什么?

它是一个变量吗?那为什么它后面没有赋值运算符呢?

这是一个函数定义吗?我可以在Groovy的任意位置定义函数吗?如果这是一个函数定义,那么errors是什么?

submit是一个函数调用吗?它接收{ $('input[type=submit]') }作为参数吗?如果是,那么这个函数在哪里定义?例如,MyVeryStrangeForm在哪里定义(根本没有定义)?

如果这是一个函数调用,那么它不会起作用,因为它未定义...

1个回答

19

回答所有问题的快速方式:它是一段代码,类似于匿名函数,在Groovy中称为闭包

请参阅http://www.groovy-lang.org/closures.html

在Groovy中,您可以像任何功能语言一样引用/传递/设置此类闭包。

因此,这个:

static at = { assert title == 'Messages : Create'; true }

意味着类字段at将设置为此闭包(注意,不是闭包执行的结果,而是闭包本身,作为代码块)。 此处省略了at的类型,但它可以是static def atstatic Object atstatic Closure at

稍后在不同的上下文中可以随时执行此代码,并且可以定义title等属性。

这个:

submit { $('input[type=submit]') }

意思是调用一个名为submit的函数并将闭包作为参数。

如果您想编写自己的此类函数,应该如下所示:

def submit(Closure code) {
    code.call()
}

括号可以省略,所以可以写成submit({$('input[type=submit]')})。其他函数也同样适用,可以写成println 'hello world!'而不是println('hello world')。

还有一种常见的做法是把闭包定义为最后一个参数,比如:

def errors(Map opts, Closure code) {
  ....
}

在这种情况下,您可以像往常一样将第一个参数放在括号中,并在外部使用闭包:

errors(required:false) { ...... }

同意:

errors([required: false], { ..... })

为什么它没有写成 form = { $('form') } 而是 form { $('form') },即没有赋值? - Dims
如果它总是被写成“像任何函数式语言一样”,那么我会理解这个。 - Dims
这不是调用函数,因为我被允许在那里编写自己的名称! - Dims
1
刚刚检查了源代码:https://github.com/geb/geb/blob/master/module/geb-core/src/main/groovy/geb/content/PageContentSupport.groovy,确实如此,这是由`methodMissing`处理的。 - Igor Artamonov
1
是的,在Groovy中,您可以处理调用不存在的函数。 - Igor Artamonov
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接