大括号语法在Groovy中意味着什么?

时间:2016-01-07 15:47:20

标签: groovy geb

这种语法在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 manual

问题是关于Groovy,我想用Groovy的术语知道答案。

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

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

=的右侧是什么?这是封闭吗?或者如果这是一个匿名类?或者如果这些是相同的?

花括号内的submit是什么?

这是变量吗?为什么之后没有赋值运算符呢?

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

submit是函数调用,接收{ $('input[type=submit]') }作为参数吗?如果是,那么可以定义此功能的位置?例如,MyVeryStrangeForm在哪里定义(无处)?

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

1 个答案:

答案 0 :(得分:9)

快速回答所有问题:它是一个代码块,比如匿名函数,在Groovy中称为 closure

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

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

所以这个:

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

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

此代码可以在以后的任何时间执行,在不同的上下文中定义title等。

此:

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

表示使用closure作为参数调用函数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], { ..... })