2011-09-04 15 views
12

tôi có một đối tượng với một số lĩnh vực,groovy: Có một tên trường, cần phải thiết lập giá trị và không muốn sử dụng công tắc

class TestObj { 
    def field1 
    def field2 
} 

Tôi có một cặp giá trị v1 = "field1" và v2 = "value2" Tôi muốn đặt v2 vào trường thích hợp dựa trên tên của v1, nhưng tôi không muốn làm điều đó bằng công tắc hoặc nếu câu lệnh, tôi tiếp tục nghĩ rằng phải có nhiều "rãnh nhỏ" "cách để đạt được kết quả khác hơn là làm điều gì đó như thế này:

setValues(def fieldName, def fieldVal) { 
    if (fieldName.equals("field1")) { 
    field1 = fieldVal 
    } 
    if (fieldName.equals("field2")) { 
    field2 = fieldVal 
    } 
} 

Tôi đã thử làm điều này:

setValues(def fieldName, def fieldVal) { 
    this['${fieldName}'] = fieldVal 
} 

Tuy nhiên thất bại, nói không có tài sản $ {} fieldName

Cảm ơn.

+2

Ok, công trình này: đây [ "$ {fieldName}"] = fieldVal –

+1

'' là chuỗi bình thường và sẽ không làm việc với macro, '$ là 'sẽ đơn giản là' $ là 'trong khi "$ là" sẽ giải quyết cho giá trị của biến đó. – xlson

Trả lời

19

Bạn có thể sử dụng GStrings khi bạn nhận được một lĩnh vực, như thế này:

def obj = new TestObj() 
def fieldToUpdate = 'field1' 
obj."$fieldToUpdate" = 3 
+5

Để người tiếp theo tình cờ gặp phải điều này ... Nếu bạn sử dụng dấu nháy đơn 'thay vì', nó sẽ không hoạt động. Groovy chỉ trừ $ khi sử dụng dấu ngoặc kép. – RMorrisey

6

Trong Groovy bạn không phải xác định một tài sản để có một tài sản. Sử dụng getPropertysetProperty gọi móc truy cập tài sản trong Groovy:

class TestObj { 
    def properties = [:] 
    def getProperty(String name) { properties[name] } 
    void setProperty(String name, value) { properties[name] = value } 

    void setValues(def fieldName, def fieldVal) {setProperty(fieldName, fieldVal)} 
} 

def test = new TestObj() 
test.anyField = "anyValue" 
println test.anyField 

test.setValues("field1", "someValue") 
println test.field1 

test.setValues("field2", "anotherValue") 
println test.field2 
Các vấn đề liên quan