2016-01-07 51 views
2

这是什么意思的语法在Groovy: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预定义的?

什么是=(等于singn)后面呢?它是赋值运算符吗?

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

什么是submit里面的大括号?

这是一个变量吗?然后为什么没有赋值运算符?

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

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

如果这是函数调用,那么它将无法工作,因为不确定的......

回答

5

快速回答所有的问题:这是一个代码块,像匿名函数,在Groovy称为关闭

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

在Groovy可以引用/通过/设定成关闭,如在任何功能性语言。

因此,这:

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

意味着类字段at将被设置为这个封闭件(通知,不会导致封闭执行的,但关闭本身,代码块)。在省略那里的类型,但它可能是static def atstatic Object at,或static 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], { ..... }) 
+0

通过它为什么不写'形式= {$( '形式')}''但形式{$( '形式')}',即w ^没有转让? – Dims

+0

我的意思是,如果它总是写成“在任何功能语言” – Dims

+0

看到我的更新(作为示例提交) –

相关问题