2012-07-20 1 views
6

Groovy 1.8.6 및 2.0.0에서이 문제가 발생했습니다.확장 된 메타 클래스로 정적 속성으로 카 트리브 클로저를 추가하면 기본 매개 변수 값이 손실됩니다.

그래서 이러한 시나리오 예상대로 모든 작업 :로

def ay = { one, two=[:] -> [one, two] } 
def be = { one, two, three=[:] -> [one,two,three] } 
def ayprime = ay.curry('PRIME') 
def beprime = be.curry('PRIME') 
def beprimer = be.curry('PRIME', 'PRIMER') 

assert ay(1,2) == [1,2] 
assert ay(1) == [1,[:]] 
assert be(1,2,3) == [1,2,3] 
assert be(1,2) == [1,2,[:]] 

assert ayprime(1) == ['PRIME', 1] 
assert ayprime() == ['PRIME', [:]] 
assert beprime(1,2) == ['PRIME', 1, 2] 
assert beprime(1) == ['PRIME', 1, [:]] 
assert beprimer(1) == ['PRIME', 'PRIMER', 1] 
assert beprimer() == ['PRIME', 'PRIMER', [:]] 

이 수행합니다

class Klass { 
    static def smethod = { one, two=[:] -> [one, two] } 
} 
assert Klass.smethod(1,2) == [1, 2] 
assert Klass.smethod(1) == [1, [:]] 

예상대로 또한, 작동이 :

Klass.metaClass.static.aymethod << ay 
assert Klass.aymethod(1) == [1, [:]] 

에 대한 기본 매개 변수 잔인하지 않은 종결은로의 임무에서 살아남는다.. thusly 히

Klass.metaClass.static.ayprimemethod << ayprime 
assert Klass.ayprimemethod() == ['PRIME', [:]] 

:

assert Klass.ayprimemethod() == ['PRIME', [:]] 
      |    | 
      [PRIME, null] false 

과 마찬가지로이 실패

그러나 실패

Klass.metaClass.static.beprimermethod << beprimer 
assert Klass.beprimermethod() == ['PRIME', 'PRIMER', [:]] 

thusly 히 :

assert Klass.beprimermethod() == ['PRIME', 'PRIMER', [:]] 
     |    | 
     |    false 
     [PRIME, PRIMER, null] 

카레 크로와에서는 기본 매개 변수 값이 직접 작동하지만 클로저가 Klass의 정적 멤버로 지정되면 손실됩니다.

은 버그가있는 것 같아입니다. 어디서나이 동작을 발견 할 수 없었습니다. 내가 놓친 게 있니?

+0

나는 동일한 행동을보고있다. 또한 클래스 인스턴스 메서드로 테스트 했으므로 (Klass.metaClass.ayprimemethod << ayprime; 새로운 Klass(). ayprimemethod() == [ 'PRIME', [:]]') 같은 문제를 발견했습니다. JIRA에서 버그를 신고해야합니다 (http://jira.codehaus.org/secure/BrowseProject.jspa?id=10242). – OverZealous

+0

완료. http://jira.codehaus.org/browse/GROOVY-5621 –

+0

커링에 대한 설명 주셔서 감사합니다 :) –

답변

0

여전히 문제가 생기면 Groovy 트렁크로 고정 될 때까지 해결 방법이 될 수 있습니다. 물건을 파이썬하는 파이썬 방법 :

def ayprime = { x -> x ? ay('PRIME', x) : ay('PRIME') } 
def beprime = be.curry('PRIME') 
def beprimer = { x -> x ? be('PRIME', 'PRIMER', x) : be('PRIME', 'PRIMER') } 
관련 문제