2012-02-16 20 views

cevap

56

JavaScript içinde her zaman bir nesnenin sınıf yaratılıyor sağlamalıdır, bu nedenle JavaScript'in nesne değişmezi sözdizimine Groovy eşdeğer yoktur gibi. Bununla birlikte, Groovy, bir JavaScript nesnesine kavramsal olarak çok benzer olan, yani her ikisi de bir özellik ya da isim-değer çifti koleksiyonu olan bir Map için bir sözdizimsel sözdizimine sahiptir.

yukarıdaki JavaScript eşdeğer Groovy kodudur: Hala belirli bir sınıfın (java.util.LinkedHashMap) bir nesne oluştururken burada kullanılan hiçbir sınıf adı vardır

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

bile. Yukarıdaki kod sadece kısaltmasıdır:

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

Expando class bile belki bir JavaScript nesnesine daha benzer olduğunu ve bir sınıf tanımlama "havai" önlemek veya dinamik bir nesneyi istemek istediğinizde yararlıdır herhangi bir rasgele özellik çalışma zamanında eklenebilir.

+0

link: def obj = [:] – Hudson

+0

İlginç. Birini merak ederseniz, 'LinkedHashMap' içinde diziler/listeler kullanılmasına izin verilir. Örneğin. bu işler: 'def obj = [a: [1,2," foo "]]; obj.a.push ("bar") ' – Nux

21

Hiç kimse Expando sınıfından bahsetmemişti. Bu, fonksiyonlarınızdaki özellikleri doğrudan referans alabilmeniz için bir harita üzerinde ekstra işlevsellik ekler. Aşağıdaki kod örneği.

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

baskılı çıkışı:

def

ABC

groovy.lang.MissingPropertyException

ABC (eğer map.run içinde println ($ a) dışarı yorum yaparsanız , println ($ b), ABC'yi yazdırır)

Ek satır sonlarını yoksay çıktıda. Def ve üst üste ardışık satırlarda ABC koyarak bir zaman oldu.

düzenleme: Api da boş harita oluşturmak için bu sözdizimini kullanabilirsiniz

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

+0

Harika Bul! Ünlü Haki, aynı zamanda Expando sınıfı hakkında da yazmıştır: http://mrhaki.blogspot.com/2009/10/groovy-goodness-expando-as-dynamic-bean.html Expando sınıfının aslında olduğunu söyleyebilirim. sorulan soruya cevap. – Henrik

İlgili konular