2016-08-17 47 views
4

我有一個Groovy特性,它需要提供一個配置Closure作爲庫方法調用的參數(它是HttpBuilder,但它應該沒關係)。如何讓閉包代理在特性中被調用時正確使用

爲了再現這個問題,我創建了以下簡單的例子:

trait T { 
    def doIt() { 
     return { 
      n = 1 
     } 
    } 
} 

class Delegate { 
    int n 
} 

class Tish implements T { 
    def go() { 
     def closure = doIt() 
     def d = new Delegate() 
     closure.delegate = d 
     closure() 
     assert d.n == 1 
    } 
} 

new Tish().go() 

這是預期,因爲在T性狀doIt()方法返回的封閉運行時無差錯運行,其委託設置的東西,可以設置n變量設置爲1 ....

然而,這並不工作,我得到這個錯誤:

groovy.lang.MissingPropertyException: No such property: n for class: Tish 

如果我讓T上課,讓Tish擴展它,那麼它的作品!

我試着改變Closure的委託策略,但沒有幫助。

這是一個Groovy錯誤還是有辦法解決這個問題?

+0

該死!這不適用於Groovy 2.4.5或2.4.7。 – Renato

+0

您是否嘗試過[報告爲錯誤](https://issues.apache.org/jira/browse/GROOVY)? –

+0

我不確定這是一個錯誤,或者這是特質應該如何工作。如果確實是一個錯誤,我可以報告。 – Renato

回答

0

好的,我找到了一個解決方法...但是,知道這是否是一個錯誤會很有趣,如果是的話,什麼時候它會被Groovy團隊修復!

的配置閉包內的所有調用可以通過調用getDelegate()方法,然後直接將所有的屬性就可以了,這樣獲得實際的委託對象:

return { 
    def d = getDelegate() 
    d.n = 1 
} 

並不理想,但讓我脫膠,希望它可以幫助其他人...

+0

我也發現用'setN(1)'替換'n = 1'允許它工作 – bdkosher

+0

啊,這很好......謝謝指出。 – Renato

相關問題