2011-05-12 186 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()?我相信你可以很容易地使用execute 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}" 
    } 
} 

一個側面說明一個例子,我不認爲製造商的支持是要走的路。在java中創建構建器可能很有用。但純粹的groovy更容易。至少對於小到中等複雜程度的構建者來說(從來沒有寫過非常大的構建者)。
您確實需要groovy的方法調度過程的一些知識,雖然

+0

您的權利只需要一個特殊的「包含」方法調用就容易得多。 – Akusete 2011-05-15 09:47:45