2014-02-16 2 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에서 수정 예정. 특성과 새로운 MOP를 사용하면 v3가 막힙니다. – Will

관련 문제