jueves, 10 de enero de 2013

Strings y GString, Tratando cadenas con Groovy


Dado el ultimo post y que me gusta comparar lenguajes, veamos como Groovy trata los Strings. 


Groovy permite el uso de " y de ' similar a javascript. De esta forma podemos usar uno o el otro según nos convenga; por ejemplo:


"Hola me llamo: 'Pepe'" o 'Hola me llamo: "Pepe"'


Groovy permite concatenar strings con el + :



a = "world"
print "hello " + a + "\n"

""" permite tener string multilinea por ejemplo:



def text = """\
Hola Pepe!
Como estas?
"""

Es posible utilizar notación para literales de cadena que tienen otras ventajas como por ejemplo no se necesita barras invertidas adicionales para escapar caracteres especiales. Esto es especialmente útil con expresiones regulares o nombres de archivos de Windows.



def s = /.*foo.*/
def dirname  = /^.*\//
def basename = /[Strings and GString^\/]+$/

GString permite interpolación de cadenas similar a Velosity, JExl o JSP EL.  



foxtype = 'quick'
foxcolor = ['b', 'r', 'o', 'w', 'n']
println "The $foxtype ${foxcolor.join()} fox"

Internamente lo que pasa es que si una cadena contiene un ${...}  el compilador se da cuenta y instancia GString. GString trabaja la interpolación como lazy evaluation; lo que permite muchísimo. 


println new Date()



x = "It is currently ${ new Date() }"
assert x.values[0] instanceof Date
y = "It is currently ${ writer -> writer << new Date() }"
assert y.values[0] instanceof Closure
sleep 5000
println x
println y

GString también le permite usar clusures de la siguiente forma:


def deepest = {-> "deepest"}
def deep = {-> "deeper and $deepest"}
println "how deep is deep? $deep"

// which is equivalent to:

println "how deep is deep? ${{-> "deeper and ${{-> "deepest"}}"}}" // for demonstrating it is a nested usage only



Otro lenguaje y otra forma de hacer las cosas. Groovy permite manejar Strings fácilmente. 


Dejo Link: 

http://groovy.codehaus.org/Strings+and+GString