Динамическое создание GString не работает, как я ожидаю - PullRequest
1 голос
/ 15 апреля 2011

У меня есть следующий код:

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")

Я думаю Я знаю причину, но я хотел бы знать наверняка.

Ответы [ 2 ]

1 голос
/ 16 апреля 2011

причина в том, что Groovy не может обеспечить доступ к контексту, в котором была создана java.lang.String, например,

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

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

Таким образом, для данного java.lang.String при вызове GString.plus не выполняется оценка.

1 голос
/ 16 апреля 2011

Поскольку вы объявляете как g, так и s как строки, метод toString () просто возвращает их значения.Фактической оценки кода Groovy нет (это может быть опасно во многих случаях, если вы подумаете об этом).

Я думаю, что все, чего вы пытаетесь достичь, может быть лучше достигнуто с помощью замыканий?

...