2013-09-24 23 views
12

我最近一直在閱讀關於在Groovy中的集合中使用GStringImpl s和String的行爲。Groovy GStringImpl和字符串行爲

我明白這個計算結果爲false的原因...

"${'test'}".equals("test") == false

是由於.equals()合同的對稱性要求,但我不知道是否有一個原因,GStringImpl不能只需立即評估爲String。所以,當我做這樣的事情......

"${'someString'}"

我沒有得到一個GStringImpl,我只是得到一個普通的Java String回來,這是我能爲關鍵的地圖立即使用,例如。

我知道有一些解決方法,像

String s = "${'someString'}"

但是像這樣的東西是有點不方便,GStringImplString之間的mixup似乎是一個很大的「疑難雜症」對Groovy newbees。

回答

15

GStrings由於某些原因未被立即評估爲String,主要與延遲評估(這對於日誌記錄非常有用)和模板有關。在Strings and GString你可以找到一個很好的解釋:

GString可能涉及懶評價,所以它不是直到() 方法調用的GString的評估了toString。這個懶惰的評估 對於日誌記錄很有用,因爲它允許計算 字符串,不同字符串的toString()對值的調用,以及不同字符串的連接 (如果有的話)可以懶惰地完成。

當你不想使用模板引擎, 或者當你真的想完全懶惰的評估GStrings時,GString非常方便。當一些嵌入在GString中的變量 變量中,對該變量調用toString()以獲取字符串表示並將其插入 最終字符串中。

因此:

的GString和字符串是兩個不同的類別,並因此使用的GString的 對象作爲地圖對象或涉及的GString 對象比較鍵,可產生意想不到的效果當與字符串 組合因爲一個GString和一個String不會有相同的hashCode,它們也不會相同。兩個 類型之間沒有用於比較或映射鍵的自動強制,所以有時需要 在GString對象上顯式調用toString()。

對於Groovy.sql類中的方法,代碼爲 需要GString時,意外轉換爲字符串可能會導致問題。

+0

不夠公平。感謝您的解釋。 – rcgeorge23

+0

我們可以動態擴展GStringImpl類來自動調用施工中的.toString()嗎? –