Доступ к свойствам объекта в groovy с помощью [] - PullRequest
12 голосов
/ 02 ноября 2010

Скажите, у меня есть следующий код в Groovy:

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

Я хочу получить доступ к свойству eyes, используя []:

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

Но это работает не так, как я ожидал (поскольку он пытается получить доступ к свойству face.eyes объекта Human, а не к свойству eyes свойства human.face).

Есть ли другой способ сделать это?

Ответы [ 2 ]

15 голосов
/ 02 ноября 2010

Вам нужно будет оценить строку, чтобы добраться до нужного вам свойства. Для этого вы можете сделать:

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

(который разбивает humanProperty на список имен свойств, затем, начиная с объекта human, вызывает каждое свойство по очереди, передавая результат следующей итерации.

Или вы можете использовать класс Eval, чтобы сделать что-то вроде:

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

Чтобы использовать нотацию [], вам необходимо выполнить:

human[ 'face' ][ 'eyes' ]
1 голос
/ 04 февраля 2013

Более простым способом было бы просто выполнить:

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

Но если вы не знаете требуемых значений («лицо» и «глаза»), есть и более простой и понятный способ.

def str = "face.eyes"
def values = str.split("\\.")
def value = human[values[0]][values[1]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...