es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Crear GString a partir de String

Estamos utilizando Groovy de forma segura en cuanto a tipos. En algún momento quiero invocar un método con la siguiente firma:

void foo(GString baa)

Siempre y cuando la cadena que ingrese contenga ${baz}, todo está bien, pero cuando uso una cadena pura obtengo un error de compilación.

foo("Hola, ${baz}") // Bien
foo("Hola, mundo") // No se puede asignar un valor de tipo java.lang.String a una variable de tipo groovy.lang.GString
foo("Hola, mundo${""}") // Bien pero feo

¿Existe alguna forma elegante de crear un GString a partir de una cadena?

EDICIÓN

Supongo que he simplificado demasiado mi problema. Estoy utilizando parámetros de constructor con nombre para inicializar objetos. Dado que algunas de las cadenas se evalúan de forma perezosa, necesito almacenarlas como GString.

class SomeClass {
  GString foo
}

new SomeClass(
  foo: "Hola, mundo" // Falla
)

Así que la sobrecarga de métodos no es una opción.

La solución, como mencionó willyjoker, es usar CharSequence en lugar de String.

class SomeClass {
  CharSequence foo
}

new SomeClass(
  foo: "Hola, mundo" // Funciona
)

new SomeClass(
  foo: "Hola, ${baa}" // También funciona perezosamente
)
Tags:  ,

Answer

  1. Avatar for davy.ai

    Creando un GString a partir de un String en Groovy

    Si necesitas invocar un método en Groovy con un parámetro GString, pero quieres pasar un String regular, puedes crear un GString a partir de un String utilizando comillas dobles (") e incrustando la variable o expresión que deseas evaluar dentro de ${}.

    Por ejemplo:

    String baz = "Groovy"
    void foo(GString baa) {
      println "Baa: $baa"
    }
    
    // Pasar un GString con variable incrustada
    foo("Hola, ${baz}")
    
    // Pasar un GString con variable incrustada y concatenación de String
    foo("Hola, " + baz)
    
    // Pasar un GString con expresión incrustada
    foo("La hora es ${new Date()}")
    
    // Crear un GString a partir de un String regular
    def gstring = "Hola, ${baz}" as GString
    foo(gstring)
    

    Si pasas un String regular a foo, obtendrás un error de compilación, porque el método solo acepta un parámetro GString.

    // Error de compilación: No se puede asignar un valor de tipo java.lang.String a una variable de tipo groovy.lang.GString
    foo("Hola, mundo")
    

    Sin embargo, también puedes crear un GString a partir de un String regular al incrustar una variable vacía dentro de ${}, así:

    // Crear un GString a partir de un String regular
    def gstring = "Hola, mundo${}" as GString
    foo(gstring)
    

    Esto creará un GString sin ninguna variable o expresión incrustada, pero aún será reconocido como un GString por el compilador de Groovy.

    Utilizando GString con parámetros nombrados en el constructor

    Si necesitas utilizar un GString con parámetros nombrados en el constructor en Groovy, puedes utilizar CharSequence en lugar de String, ya que GString implementa la interfaz CharSequence.

    Por ejemplo:

    class SomeClass {
      GString foo
    }
    
    def someObject = new SomeClass(foo: "Hola, ${baz}" as CharSequence)
    

    Esto te permitirá almacenar un GString como parámetro del constructor, incluso si el valor se evalúa de forma diferida.

Comments are closed.