2012-02-16 26 views

Odpowiedz

56

W Groovy musisz zawsze podać klasę tworzonego obiektu, więc nie ma odpowiednika w Groovy do dosłownej składni JavaScript.

Jednak Groovy ma literalną składnię dla Map, która jest koncepcyjnie bardzo podobna do obiektu JavaScript, tj. Obie są zbiorem właściwości lub par nazwa-wartość.

Odpowiednik kodu Groovy do JavaScriptu powyżej jest:

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

Choć nie ma nazwy klasy stosowane tu jesteś jeszcze tworzenia obiektu danej klasy (java.util.LinkedHashMap). Powyższy kod jest tylko skrótem:

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

Expando class jest chyba jeszcze bardziej podobny do obiektu JavaScript i jest przydatna, gdy chcemy uniknąć „overhead” definiowania klasę, lub chcą dynamicznego obiektu do którą dowolną dowolną właściwość można dodać w czasie wykonywania.

+0

można również użyć tej składni, aby utworzyć pustą mapę: def obj = [:] – Hudson

+0

Interesujące. W przypadku, gdybyś się zastanawiał - dozwolone jest używanie tablic/list wewnątrz 'LinkedHashMap'. Na przykład. to działa: 'def obj = [a: [1,2," foo "]]; obj.a.push ("bar") ' – Nux

21

Lekko zaskoczony, że nikt nie wspomniał o klasie Expando. Zapewnia to dodatkową funkcjonalność na mapie, dzięki czemu możesz bezpośrednio odwoływać się do właściwości w ramach swoich funkcji. Przykład kodu poniżej.

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

wydruk:

def

ABC

groovy.lang.MissingPropertyException

ABC (jeśli zakomentuj println ($ a) w map.run , println ($ b) wypisuje ABC)

Zignoruj ​​dodatkowe łamania linii na wyjściu. Miałem sporo czasu stawiając def i ABC na kolejnych liniach.

edit: Api Link

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

+0

Świetne znalezisko! Znakomity pan Haki napisał również o klasie Expando: http://mrhaki.blogspot.com/2009/10/groovy-goodness-expando-as-dynamic-bean.html Powiedziałbym, że klasa Expando jest rzeczywiście odpowiedź na pytanie. – Henrik

Powiązane problemy