花括号语法在Groovy中的含义是什么?

花括号语法在Groovy中的含义是什么?,groovy,geb,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 { $('

这个语法在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() }
    }
}
(摘自)

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

什么是
内容
?它是一个静态变量吗?它的名称是随机的还是由
页面的基类预定义的

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

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

什么是大括号内的
submit

这是一个变量吗?为什么在它之后没有赋值操作符呢

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

是不是
submit
是一个函数调用,接收
{$('input[type=submit]')}
作为参数?如果是,那么可以在哪里定义此函数?例如,哪里定义了
MyVeryStrangeForm
(哪里都没有)


如果这是函数调用,那么它将无法工作,因为它是未定义的…

快速回答所有问题:这是一段代码,就像Groovy中的匿名函数一样,称为闭包

在Groovy中,您可以引用/传递/设置这样的闭包,就像在任何函数式语言中一样

因此:

static at = { assert title == 'Messages : Create'; true }
意味着
处的类字段
将被设置为此闭包(注意,不是闭包执行的结果,而是闭包本身,作为代码块)。此处省略了at的类型,但它可以是位于
静态定义或位于
静态对象,或位于
静态闭包

此代码可以在以后的任何时候在不同的上下文中执行,并定义
标题

这:

表示以闭包作为参数调用函数
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')}
,即没有赋值?我的意思是,如果它总是写“像任何函数语言一样”,我会理解这一点,这不是调用函数,因为我可以在那里写我自己的名字!刚刚检查过源代码:没错,这是由
methodMissing
yes处理的,在groovy中,您可以处理对不存在的函数的调用。
errors([required: false], { ..... })