2014-02-16 34 views
1

有人可以請解釋爲什麼qux失敗的調用?它似乎沒有捕獲靜態關閉變量foo創建時的名稱。如果我故意將名稱分配給一個變量,如baz它可以工作,或者如果我通過該類調用它。我認爲這個變量捕獲應該也適用於閉包類變量,但是我必須缺少一些東西。Groovy關閉不捕獲靜態關閉變量

class C { 
    static foo = { "foo" } 
    static bar = { C.foo() } 
    static baz = { def f = foo; f() } 
    static qux = { foo() } 
}  
println C.foo() //works 
println C.bar() //works 
println C.baz() //works 
println C.qux() //fails 

我也試過這個作爲測試和它沒有問題捕獲變量:

class C { 
    static i = 3 
    static times3 = { "foo: ${it * i}" } 
}  
println C.times3(2) //works 

[編輯] 最後,如果FOO是一個簡單的方法,它也按我期望的方式工作:

class C { 
    static foo() { "foo" } 
    static bar = { foo() } 
}  
println C.bar() //works 

回答

2

看起來好像this bug。如果您將foo作爲屬性處理,它可以正常工作:

class C { 
    static foo = { "foo" } 
    static bar = { C.foo() } 
    static baz = { def f = foo; f() } 
    static qux = { foo.call() } 
}  
assert C.foo() == 'foo' 
assert C.bar() == 'foo' 
assert C.baz() == 'foo' 
assert C.qux() == 'foo' 
+0

很好找到那裏的錯誤數據庫!我同意這聽起來正是這個問題。看起來它已經存在了一段時間了。 – jrk

+0

計劃固定在groovy 3.與特點和新的澳門幣,我認爲V3會搖滾。 – Will