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

由于您将 g 和 s 都声明为字符串,因此 toString() 方法将简单地返回它们的值。没有对 Groovy 代码的实际评估(如果您考虑一下,这在很多情况下可能很危险)。

我认为您想要实现的任何目标都可能通过闭包更好地完成?

于 2011-04-16T05:06:55.173 回答
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 回答