Groovy: как получить значение? Private?переменная замыкания - PullRequest
2 голосов
/ 28 февраля 2012

У меня есть замыкание, которое прекрасно работает, но иногда я хотел бы получить окончательное значение временной переменной, которую я определяю в замыкании. Пример:

def someClosure = {Number input->
  def howDoIGetThis = input + 4
  return 2 * input
}

def normalWay = someClosure(2)
assert normalWay == 4

def myFantasy = someClosure(2).howDoIGetThis
assert myFantasy == 6

Возможно ли это как-нибудь?

Ответы [ 2 ]

3 голосов
/ 28 февраля 2012

Вы можете сохранить состояние в владельце или делегате замыкания.

def howDoIGetThis
def someClosure = {Number input ->
    howDoIGetThis = input + 4
    return input * 2
}

def normalWay = someClosure(2)
assert normalWay == 4

someClosure(2)
def myFantasy = howDoIGetThis
assert myFantasy == 6

Если вы хотите контролировать, к какому объекту относится состояние, вы можете переопределить делегат замыкания. Например:

def closureState = [:]
def someClosure = {Number input ->
    delegate.howDoIGetThis = input + 4
    return input * 2
}
someClosure.delegate = closureState

def normalWay = someClosure(2)
assert normalWay == 4

someClosure(2)
def myFantasy = closureState.howDoIGetThis
assert myFantasy == 6
2 голосов
/ 28 февраля 2012

Нет, нет способа получить переменную, поскольку замыкание просто возвращает единственный результат (поэтому somclosure(2).howDoIGetThis не может работать), и нет способа получить дескриптор экземпляра замыкания после его запуска...

Лучшее, что я могу придумать, это вернуть несколько значений из замыкания следующим образом:

def someClosure = {Number input->
  def howDoIGetThis = input + 4
  [ 2 * input, howDoIGetThis ]
}

def (normalWay, myFantasy) = someClosure(2)

assert normalWay == 4
assert myFantasy == 6
...