Groovy 中的花括号语法是什么意思?
What does curly brackets syntax mean in 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
的基数 class 预定义的?
后面的=
(等号)是什么?是赋值运算符吗?
=
右边是什么?这是闭包吗?或者如果这是一个匿名 class?或者它们是否相同?
花括号里面的submit
是什么?
这是变量吗?那为什么后面没有赋值运算符呢?
这是函数定义吗?我可以在 Groovy 中的任意位置定义函数吗?如果这是一个函数定义,那么 errors
是什么?
难道submit
是一个函数调用,接收{ $('input[type=submit]') }
作为参数?如果是,那么这个函数在哪里可以定义?例如,MyVeryStrangeForm
在哪里定义(无处)?
如果这是函数调用,那么它将无法工作,因为它是未定义的...
所有问题的快速回答:它是一个代码块,类似于匿名函数,在Groovy.
中称为closure
见http://www.groovy-lang.org/closures.html
在Groovy中你可以reference/pass/set这样的闭包,就像在任何函数式语言中一样。
所以这个:
static at = { assert title == 'Messages : Create'; true }
意味着 class 字段 at
将被设置为这个闭包(注意,不是闭包执行的结果,而是闭包本身,作为代码块)。此处省略了 at 的类型,但可以是 static def at
或 static 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], { ..... })
这个语法在 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
的基数 class 预定义的?
后面的=
(等号)是什么?是赋值运算符吗?
=
右边是什么?这是闭包吗?或者如果这是一个匿名 class?或者它们是否相同?
花括号里面的submit
是什么?
这是变量吗?那为什么后面没有赋值运算符呢?
这是函数定义吗?我可以在 Groovy 中的任意位置定义函数吗?如果这是一个函数定义,那么 errors
是什么?
难道submit
是一个函数调用,接收{ $('input[type=submit]') }
作为参数?如果是,那么这个函数在哪里可以定义?例如,MyVeryStrangeForm
在哪里定义(无处)?
如果这是函数调用,那么它将无法工作,因为它是未定义的...
所有问题的快速回答:它是一个代码块,类似于匿名函数,在Groovy.
中称为closure见http://www.groovy-lang.org/closures.html
在Groovy中你可以reference/pass/set这样的闭包,就像在任何函数式语言中一样。
所以这个:
static at = { assert title == 'Messages : Create'; true }
意味着 class 字段 at
将被设置为这个闭包(注意,不是闭包执行的结果,而是闭包本身,作为代码块)。此处省略了 at 的类型,但可以是 static def at
或 static 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], { ..... })