2010-11-02 41 views
11

Nói rằng tôi có đoạn mã sau vào groovy:thuộc tính đối tượng truy cập trong groovy sử dụng []

class Human { 
    Face face 
} 
class Face { 
    int eyes = 2 
} 
def human = new Human(face:new Face()) 

tôi muốn truy cập các eyes tài sản bằng cách sử dụng []:

def humanProperty = 'face.eyes' 
def value = human[humanProperty] 

Nhưng điều này không làm việc như tôi mong đợi (vì điều này cố gắng truy cập một thuộc tính có tên 'face.eyes' trên đối tượng Human, không phải thuộc tính mắt trên thuộc tính human.face).

Có cách nào khác để thực hiện việc này không?

Trả lời

14

Bạn cần đánh giá chuỗi để đến thuộc tính bạn yêu cầu. Để làm điều này, bạn có thể làm:

humanProperty.split(/\./).inject(human) { obj, prop -> obj?."$prop" } 

(để tách humanProperty vào một danh sách tên tài sản, sau đó, bắt đầu với các đối tượng human, kêu gọi mỗi tài sản lần lượt, qua kết quả cho phiên bản kế tiếp.

Hoặc, bạn có thể sử dụng lớp Eval để làm một cái gì đó như:

Eval.x(human, "x.${humanProperty}") 

để sử dụng [] ký hiệu, bạn sẽ cần phải làm:

human[ 'face' ][ 'eyes' ] 
+0

Cảm ơn bạn, tôi sẽ dùng thử – Valdemar

1

Một cách dễ dàng hơn sẽ được thực hiện đơn giản:

def value = human['face']['eyes'] 

Nhưng nếu bạn không biết các giá trị cần thiết ('khuôn mặt' và 'mắt'), cũng là một cách dễ dàng hơn và rõ ràng hơn.

def str = "face.eyes" 
def values = str.split("\\.") 
def value = human[values[0]][values[1]] 
Các vấn đề liên quan