2012-02-16 27 views

Respuesta

56

En Groovy siempre debe proporcionar la clase de un objeto que se está creando, por lo que no hay equivalente en la sintaxis de objeto-literal de Groovy a JavaScript.

Sin embargo, Groovy tiene una sintaxis literal para Map, que es conceptualmente muy similar a un objeto JavaScript, es decir, ambos son una colección de propiedades o pares nombre-valor.

El código Groovy equivalente al JavaScript anterior es:

def obj = [a: '1'] 
println obj.a 

A pesar de que no hay ningún nombre de la clase usada aquí todavía se está creando un objeto de una clase particular (java.util.LinkedHashMap). El código anterior es sólo la abreviatura de:

def obj = new LinkedHashMap(); 
obj.a = '1' 
println obj.a 

la Expando class es quizás aún más similar a un objeto JavaScript, y es útil cuando se desea evitar la "sobrecarga" de la definición de una clase, o quiere un objeto dinámico a que cualquier propiedad arbitraria se puede agregar en tiempo de ejecución.

+0

también puede utilizar esta sintaxis para crear un mapa vacío: def obj = [:] – Hudson

+0

interesante. En caso de que uno se pregunte, está permitido usar matrices/listas dentro de 'LinkedHashMap'. P.ej. esto funciona: 'def obj = [a: [1,2," foo "]]; obj.a.push ("bar") ' – Nux

21

Ligeramente sorprendido de que nadie haya mencionado la clase Expando. Esto agrega una funcionalidad extra sobre un mapa en el que puede hacer referencia directamente a las propiedades dentro de sus funciones. Ejemplo de código a continuación.

def expando = new Expando(a:"def") 
expando.run = {def b -> 
println("$a") 
println("$b") 
} 
expando.run("ABC") 

def map = [a:"def"] 
map.run = {def b -> 
println("$a") //THIS DOES NOT WORK. You will get a missing property exception. 
println("$b") 
} 
map.run("ABC") 

salida impresa:

def

ABC

groovy.lang.MissingPropertyException

ABC (si comentar el println ($ a) en el map.run , println ($ b) imprime ABC)

Ignora los saltos de línea adicionales en la salida. Estaba pasando un buen rato poniendo def y ABC en líneas consecutivas.

edición: Api enlace

http://groovy.codehaus.org/api/groovy/util/Expando.html

+0

¡Excelente descubrimiento! El ilustre señor Haki también ha escrito sobre la clase Expando: http://mrhaki.blogspot.com/2009/10/groovy-goodness-expando-as-dynamic-bean.html Diría que la clase Expando es en realidad la respuesta a lo que se estaba preguntando. – Henrik

Cuestiones relacionadas