GString の評価について誤解してた…

ゲンゾウ用ポストイット: GStringは場合により遅延評価される でも書いてある通りなんですが、こんなコードを書いて大いに誤解してました。

def str = 'test'
def gstr = "GString : $str"
println gstr // GString : test
str = 'test-2'
println gstr // GString : test <= ここでも変わらないから、遅延評価じゃない!と思ってた。

これって、変数 str(java.lang.String 型?) のインスタンスが変わってるんだよね?だから、変化しない出力しても変化しない。
よく考えれば当たり前だよね〜。だって、新しいインスタンスを str に代入してるから。


あと、Groovy イン・アクション の P.62 の記載にも引っ掛かった。

GStringの値は宣言時にバインドにされます。

宣言時にって書いてあったので、遅延評価じゃないんだって思ってたんだけど、この続きに

GStringがjava.lang.Stringに変換される時に文字列としてその値が書き出されます。

って書いてあった。これって遅延評価だよって意味だよね?


多分、「バインド」って単語の解釈を間違えてたんだなぁ〜と。
バインドってその時の値を設定するんじゃなくて、その時のインスタンスを参照するよって事なんだと思う。(正式に調べてないので、間違ってるかも)
インスタンスの値(なんか分かりにくいな。)を変更したら GString の文字列が変更されるけど、
変数に新しいインスタンスを入れても GString の文字列は変わらない。だって、GString が参照しているインスタンスは何も変わってないから。