2012-02-16 32 views

Trả lời

56

Trong Groovy, bạn phải luôn cung cấp lớp của đối tượng được tạo, do đó không có cú pháp ngữ nghĩa của Groovy với JavaScript.

Tuy nhiên, Groovy có cú pháp ngữ cho một số Map, khái niệm rất giống với đối tượng JavaScript, tức là cả hai tập hợp thuộc tính hoặc cặp tên-giá trị.

Mã Groovy tương đương với JavaScript trên là:

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

Mặc dù không có tên lớp sử dụng ở đây bạn vẫn đang tạo ra một đối tượng của một lớp học đặc biệt (java.util.LinkedHashMap). Đoạn mã trên chỉ là viết tắt cho:

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

các Expando class có lẽ thậm chí tương tự như một đối tượng JavaScript, và rất hữu ích khi bạn muốn tránh những "chi phí" xác định một lớp học, hoặc muốn có một đối tượng động bất kỳ thuộc tính tùy ý nào có thể được thêm vào khi chạy.

+0

bạn cũng có thể sử dụng cú pháp này để tạo ra một bản đồ trống: def obj = [:] – Hudson

+0

Thú vị. Trong trường hợp một trong những bạn sẽ tự hỏi - nó được phép sử dụng mảng/danh sách bên trong 'LinkedHashMap'. Ví dụ. hoạt động này: 'def obj = [a: [1,2," foo "]]; obj.a.push ("bar") ' – Nux

21

Hơi ngạc nhiên khi không ai đề cập đến lớp Expando. Điều này bổ sung thêm chức năng trên bản đồ để bạn có thể tham chiếu trực tiếp các thuộc tính trong các hàm của mình. Ví dụ mã bên dướ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") 

sản lượng in:

def

ABC

groovy.lang.MissingPropertyException

ABC (nếu bạn nhận xét ra println ($ a) trong map.run , println ($ b) in ra ABC)

Bỏ qua các ngắt dòng thừa trong đầu ra. Đã có một heck của một thời gian đặt def và ABC trên dòng liên tiếp.

chỉnh sửa: Api liên kết

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

+0

Tìm thấy tuyệt vời! Ông Haki nổi tiếng cũng đã viết về lớp Expando: http://mrhaki.blogspot.com/2009/10/groovy-goodness-expando-as-dynamic-bean.html Tôi có thể nói rằng lớp Expando thực sự là câu trả lời cho những gì đã được hỏi. – Henrik

Các vấn đề liên quan