簡體   English   中英

大括號語法在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手冊

問題是關於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 atstatic 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM