这个语法在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() }
}
}
Run Code Online (Sandbox Code Playgroud)
(摘自Spring MVC Test HtmlUnit手册)
问题是关于Groovy,我想用Groovy的术语知道答案.
什么是content?它是静态变量吗?它的名称是随机的还是由基类预定义的Page?
之后是什么=(等号)?它是一个赋值运算符吗?
什么在右边=?这是封闭吗?或者如果这是一个匿名类?或者如果这些是相同的?
submit花括号里面是什么?
这是变量吗?为什么之后没有赋值运算符呢?
这是一个函数定义吗?我可以在Groovy中的任意位置定义函数吗?如果这是一个函数定义,那么接下来是errors什么?
是submit一个函数调用,{ $('input[type=submit]') }作为参数接收?如果是,那么可以定义此功能的位置?例如,在哪里MyVeryStrangeForm定义(无处)?
如果这是函数调用,那么它将无法工作,因为它未定义...
Igo*_*nov 10
快速回答所有问题:它是一个代码块,如匿名函数,在Groovy中称为闭包.
见http://www.groovy-lang.org/closures.html
在Groovy中,您可以引用/传递/设置此类闭包,就像在任何功能语言中一样.
所以这:
static at = { assert title == 'Messages : Create'; true }
Run Code Online (Sandbox Code Playgroud)
表示类字段at将被设置为此闭包(注意,不是闭包执行的结果,而是闭包本身,作为代码块).那里省略了at的类型,但它可以是static def ator static Object at,或static Closure at
此代码可以在以后的任何时间,在不同的上下文中,使用已title定义的等执行.
这个:
submit { $('input[type=submit]') }
Run Code Online (Sandbox Code Playgroud)
表示submit使用closure作为参数调用函数.
如果你想编写这样的自己的函数,它应该是这样的:
def submit(Closure code) {
code.call()
}
Run Code Online (Sandbox Code Playgroud)
括号可以省略,因此可以写成submit({$('input[type=submit]')}).对于其他功能也是如此,它可以println 'hello world!'代替println('hello world).
将闭包定义为最后一个参数也是一种常见的做法,例如:
def errors(Map opts, Closure code) {
....
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,你可以像往常一样传递第一个参数,用括号括起来,然后在外面关闭:
errors(required:false) { ...... }
Run Code Online (Sandbox Code Playgroud)
和...一样:
errors([required: false], { ..... })
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3881 次 |
| 最近记录: |