Динамическое создание GString не работает, как я ожидаю

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

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

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


person OscarRyz    schedule 15.04.2011    source источник
comment
Обходной путь с GStringTemplate (или что-то в этом роде), но не настоящий ответ. Вот, если вы не возражаете читать на испанском: P javamexico.org/foros/groovy / и groovy.codehaus.org/api/groovy/text/ GStringTemplateEngine.html   -  person OscarRyz    schedule 07.05.2011


Ответы (2)


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

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

person Igor    schedule 16.04.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 не выполняется оценка.

person Andre Steingress    schedule 16.04.2011