2012-10-29 6 views
0

우리는 현재 트리를 탐색하여 특정 장치 (및 하위 장치)의 모든 운영자를 캡처해야합니다. 장치에는 특정 연산자가있는 하위 장치가있을 수 있습니다.Groovy/traverse 트리에서 재귀 사용에 신참?

저는 Groovy에서 재귀를 처음 사용하기 때문에 제가 일을 제대로하고 있는지 궁금합니다. 더 나은 방법을 배우는 데 도움이되는 포인터는 무엇입니까?

def listOperators(device) { 
    // list with all operator id's 
    def results = [] 

    // closure to traverse down the tree 
    def getAllOperators = { aDevice-> 
     if(aDevice) { 
      aDevice.operators.each { it -> 
       results << it.id 
      } 
     } 
     if (aDevice?.children) { 
      aDevice.children.each { child -> 
       results << owner.call(child) 
      } 
     } 
    } 

    // call the closure with the given device 
    getAllOperators(device) 

    // return list with unique results 
    return results.unique() 
} 

답변

2

몇 가지 참고 사항 :

  • 좋은 생각이 아니다 owner를 통해 재귀 호출을 수행. 호출이 다른 클로저 내에 중첩되면 owner의 정의가 변경됩니다. 오류가 발생하기 쉽고 이름을 사용하는 것보다 장점이 없습니다. 클로저가 로컬 변수 인 경우 클로저의 선언과 정의를 위로 나눠서 이름이 범위에 포함됩니다. 예컨대 :

    def getAllOperators
    getAllOperators = { ...

  • 당신은 재귀 폐쇄 이외의 결과 목록에 연산자를 추가합니다. 그러나 각 재귀 호출의 결과를 같은 목록에 추가합니다. 목록에 또는을 추가하면 각 재귀 호출의 결과가 저장되지만 두 가지 결과는 모두 저장되지 않습니다.

    def listOperators(device) { 
        def results = [] 
        if (device) { 
         results += device.operators*.id 
         device.children?.each { child -> 
          results += listOperators(child) 
         } 
        } 
        results.unique() 
    } 
    
    :

여기에 간단한 대안이다