Как Groovy обрабатывает область закрытия и рекурсию? - PullRequest
1 голос
/ 20 августа 2011

У меня есть рекурсивная функция Python, которая создает дерево, и я пытаюсь перевести его в Groovy.

Вот версия Python ...

def get_tree(vertices):
    results = []

    if type(vertices) != list:
        vertices = [vertices]

    for vertex in vertices:
        results.append(vertex)
        children = get_children(vertex)
        if children:
            child_tree = get_tree(children)
            results.append(child_tree)

    return results

Вот вывод get_tree (1) ...

  [1, [2, 3, 4, [5, 3]]]

И вот моя попытка перевести это в Groovy замыкание ...

_tree = { vertices ->

  results = []

  vertices.each() {
    results << it
    children = it."$direction"().toList()
    if (children) {
      child_tree = _tree(children)
      results << child_tree
    }
  }
  results
}

Но это не работает - это то, что он возвращает ...

gremlin> g.v(1).outTree()    
==>[v[5], v[3], (this Collection), (this Collection)]

О чем эти "Коллекции"?

У меня есть только поверхностное понимание Groovy, и я подозреваю, что это как-то связано с тем, как Groovy обрабатывает область рекурсии и закрытия.

Пожалуйста, просветите меня:)

1 Ответ

0 голосов
/ 07 сентября 2011

Решение было добавить def к results = []:

_tree = { vertices ->

  def results = []

  vertices.each() {
    results << it
    children = it."$direction"().toList()
    if (children) {
      child_tree = _tree(children)
      results << child_tree
    }
  }
  results
}

См. https://groups.google.com/d/msg/gremlin-users/iCPUifiU_wk/mrUhsjOM2h0J

...