1

次のコードがあります。

def test( name  ) {
    s = ['$','{','n','a','m','e','}'].join()
    println s instanceof String // is true, s is not a gstring
    // create a GString 
    g = GString.EMPTY.plus( s )

    println g instanceof GString 
    println g.toString() // Shouldn't evaluate here? 
}
test("Oscar")

出力は次のようになると思います。

true
true
Oscar

しかし、代わりに私は持っています:

true
true
${name}

私はそれを使用してそれを達成できることを知っています:

def test( name ) { 
    g = "${name}"
    println g instanceof GString // is true
    println g.toString()   
}
test("Oscar")

理由はわかっていると思いますが、確実に知りたいです。

4

2 に答える 2

1

その理由は、Groovy が java.lang.String が作成されたコンテキストにまだアクセスできることを保証できないためです。

def myFunction()  {
  def a = 1
  return '${a}'
}

GString.EMPTY.plus (myFunction()) // no access to local variable a anymore!

したがって、GString.plus 呼び出しで特定の java.lang.String に対して評価は行われません。

于 2011-04-16T18:46:16.840 に答える
1

g と s の両方を文字列として宣言しているため、toString() メソッドは単純にそれらの値を返します。Groovy コードの実際の評価はありません (考えてみれば、かなりの数のシナリオでこれが危険になる可能性があります)。

あなたが達成しようとしているものは何でも、クロージャーを介してよりよく達成できると思いますか?

于 2011-04-16T05:06:55.173 に答える