在討論GString以前,咱們先討論一下Groovy裏面的String.在Groovy裏面String有java
1 println 'test string' 2 println '''test string''' 3 println '''test 跨越 4 行的 5 string''' 6 println "test string" 7 println """test string""" 8 println """test 跨越 9 行的 10 string""" 11 println "test string"
這幾種,注意用三個單引號或者三個雙引號括起來的字符串能夠換行.上面的例子裏面的字符串都是java.lang.String.閉包
接下來討論GString.只有在單個雙引號或者三個雙引號的字符串才能是GString(/asdfadf/能夠理解爲和"""asdfadf"""同樣,這種形式也能夠多行,且能夠是GString),下面是GString的例子:函數
1 def a = 6 2 def b = 2 3 def c = "+++++${a}+++"//輸出:+++++6+++ 4 def d = "test dsf ${ int x = a / b; return }**"//注意!這個不是閉包,這裏每次執行都輸出test dsf null** 5 def e = "asdf${-> int bb = 5}fgh"//0個參數的閉包,輸出:asdf5fgh 6 def f = "asdf${w -> int cc = 6; w << "bb" + cc + 77 }fgh"//1個參數的閉包,這個w是Groovy自動爲咱們傳入的StringWriter,輸出:asdfbb677fgh 7 println c 8 println d 9 println e 10 println f
從上面的例子裏面能夠看出,咱們能夠徹底在${ 與 } 之間寫任意的代碼,就跟咱們在函數裏面寫代碼同樣.代碼最後一個表達式的值的toString()就是返回的值,若是不返回值,例如上面那個例子用return返回,那麼就是null.閉包只有兩種形式,一種是無參數,另外一種是帶一個w參數,這個參數名字能夠取任意合法的標識符名沒必要非得叫w,並且也只能有這一個參數,這個w是Groovy自動爲咱們傳入的StringWriter,咱們能夠對其操做.用三個雙引號替換上面例子的單個雙引號是同樣的效果.都是GString.ui
除此以外,還有一種GString,spa
1 def person = [name: 'Guillaume', age: 36] 2 assert "$person.name is $person.age years old" == 'Guillaume is 36 years old'
這種形式只能是相似於$a.b.c的形式, "$number.toString()" 這樣將會報錯,咱們能夠理解爲Groovy把這個解釋爲 "${number.toString}()" code