ここで受け入れられた回答により、はい、GString (つまり、1 つ以上の${<expr>}
式を持つ二重引用符で囲まれた文字列) は単なる構文糖衣であるという結論に達したようです。(受け入れられた回答の最初の文を使用します:「はい。それが彼らです。」)
しかし、上記の tim_yates が指摘したように、遅延評価のため、それは間違っているようです。
上記を少し拡張すると、文字列内の 1 つ以上の式がクロージャである場合toString()
、GString で が呼び出されたときにのみ評価されます。したがって、groovyconsole では次のようになります。
def stime = "The time is: ${-> new Date().getTime()}."
println stime
Thread.sleep(500)
println stime
時刻は 1384180043679 です。
時刻は 1384180044194 です。
毎回新しい文字列を作成せずに + でこれを行うにはどうすればよいでしょうか? (私が取り組んだ 2 つの Java プロジェクトでの答えは、この種のことを行うクラスを発明することでした。) これは、単なる構文糖衣Template.java
以上のものがあることを示唆しています。または、おそらくそれは構文糖衣ですが、Java.lang.String や一般的な文字列ではなく、GString クラスの場合です。
もう一つの例:
def vals = ['a':42]
def tmpl = "The answer is ${-> vals.a}."
println tmpl
vals.a = 43
println tmpl
答えは42です。
答えは43です。
GString のこの機能が本当に好きかどうかはわかりません。私は文字列が不変であることに慣れています(Javaから来ています)。Groovy の文字列は (かなり) 違います。2 つの Groovy の「文字列」が同じインスタンスを参照する場合、それらは同じテキスト値を持つと想定できるように思われますが、それは正しくありません。
http://groovy.codehaus.org/Strings+and+GString (半分くらい)