Groovy 将curried闭包添加为带有expando元类的静态属性将丢失默认参数值

Groovy 将curried闭包添加为带有expando元类的静态属性将丢失默认参数值,groovy,static-methods,default-value,expando,Groovy,Static Methods,Default Value,Expando,我在Groovy1.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')

我在Groovy1.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', [:]]
Klass.metaClass.static.aymethod << ay
assert Klass.aymethod(1) == [1, [:]]
正如这一点:

class Klass {
    static def smethod = { one, two=[:] -> [one, two] }
}
assert Klass.smethod(1,2) == [1, 2]
assert Klass.smethod(1) == [1, [:]]
正如预期的那样,这同样有效:

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', [:]]
Klass.metaClass.static.aymethod << ay
assert Klass.aymethod(1) == [1, [:]]
因此:

assert Klass.ayprimemethod() == ['PRIME', [:]]
             |               |
             [PRIME, null]   false
assert Klass.beprimermethod() == ['PRIME', 'PRIMER', [:]]
         |                |
         |                false
         [PRIME, PRIMER, null]
同样,这也失败了:

Klass.metaClass.static.beprimermethod << beprimer
assert Klass.beprimermethod() == ['PRIME', 'PRIMER', [:]]
对于当前的闭包,默认参数值直接起作用,但当闭包被指定为
Klass
的静态成员时,默认参数值将丢失


这好像是一个错误。我在任何地方都找不到这种行为的记录。我遗漏了什么吗?

如果这个问题仍然困扰着你,我认为这可能是一个解决办法,直到它在groovy trunk中得到修复。咖喱的python方式:

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') }

我看到了同样的行为。我还将其作为类实例方法进行了测试(因此可以通过
Klass.metaClass.ayprimemethod进行测试。感谢对currying的解释:)