2011-05-12 3 views
2

Groovy 클로저를 마크 업으로 허용하는 빌더를 만듭니다. 그러나 중첩 된 클로저를 사용하여 메서드 호출을 잡는 데 문제가 있습니다.Groovy에서 중첩 된 클로저를 통해 델리게이트 전달

Closure nested = { 
    foo()  //will throw missingMethod exception 
} 
Closure root = { 
    foo()  //prints 'missing foo []' 
    inline_nested { 
    foo()  //prints 'missing foo []' 
    } 
    nested()  
} 
builder.execute (root) 

// ... 
class MyBuilder { 
    void execute (Closure closure) { 
    def clone = closure.clone() 
    clone.delegate = this 
    clone() 
    } 
    def missingMethod (String name, args) { 
    println "missing ${name} ${args}" 
    } 
} 

중첩 된 클로저에 대한 대리자 속성을 설정할 수있는 방법이 있습니까?

답변

1

나는 갈 수 없다. 당신은 아마 그것을 필요로하지 않습니다.
먼저 당신은 종결 자의 주인이거나 대의원입니다. 다른 곳에서 정의 된 클로저를 직접 호출하면 빌더 지원없이 호출이 해결됩니다.
초. 정말 그게 필요합니까 nested()? 내가, 내가 빌더 지원이 갈 수있는 방법이라고 생각하지 않는 대신

여기에 내가 보조 노트로

def nested2 = { 
    someMethodAtNested2 '3' 
    println "nested2! - $it" 
} 
def nested1 = {arg1,arg2-> 
    someMethodAtNested1 '2' 
    println "nested1! - $arg1" 
    include nested2, arg2 
} 
def root = { 
    someMethodAtRoot '1' 
    println "root!" 
    include nested1, 'param1', 'param2' 
} 
new FooBuilder().build root 

class FooBuilder { 
    void build(Closure closure) { 
    include closure 
    } 
    def include(Closure closure, ...args) { 
    def clone = closure.clone() 
    clone.delegate = this 
    clone.resolveStrategy = Closure.DELEGATE_FIRST 
    clone(*args) 
    } 
    def methodMissing(String name, args) { 
    println "missing ${name} ${args}" 
    } 
} 

을 무엇을 의미하는지의 예 쉽게 execute nested을 사용할 수 있습니다 생각합니다. java로 빌더를 작성하는 데 유용 할 수 있습니다. 그러나 순수한 그루비는 훨씬 쉽다. 적어도 중소 규모의 복잡성을 가진 건축업자들에게는 (정말로 큰 것을 쓴 적이 없다).
Groovy의 메서드 디스패치 프로세스에 대한 지식이 필요합니다.

+0

오른쪽 'include'메서드 호출을 사용하면 훨씬 쉽습니다. – Akusete