[英]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手冊 )
問題是關於Groovy,我想用Groovy的術語知道答案。
什么是content
? 它是靜態變量嗎? 它的名稱是隨機的還是由Page
的基類預定義的?
它之后是什么=
(等號)? 它是一個賦值運算符嗎?
在=
的右邊是什么? 這是封閉嗎? 或者如果這是一個匿名類? 或者如果這些是相同的?
什么是花括號內submit
?
這是變量嗎? 為什么之后沒有賦值運算符呢?
這是一個函數定義嗎? 我可以在Groovy中的任意位置定義函數嗎? 如果這是一個函數定義,那么什么是errors
呢?
submit
是一個函數調用,接收{ $('input[type=submit]') }
作為參數嗎? 如果是,那么可以定義此功能的位置? 例如, MyVeryStrangeForm
定義在哪里(無處)?
如果這是函數調用,那么它將無法工作,因為它未定義...
快速回答所有問題:它是一個代碼塊,如匿名函數,在Groovy中稱為閉包 。
見http://www.groovy-lang.org/closures.html
在Groovy中,您可以引用/傳遞/設置此類閉包,就像在任何功能語言中一樣。
所以這:
static at = { assert title == 'Messages : Create'; true }
表示將字段at
設置為此閉包(通知,不是閉包執行的結果,而是閉包本身,作為代碼塊)。 在那里省略了at的類型,但它可以是static def at
或static 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], { ..... })
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.