groovy - 使用 Expando 元类将柯里化(Currying)闭包添加为静态属性会丢失默认参数值

标签 groovy static-methods default-value expando

我在 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, [:]]

未柯里化(Currying)闭包的默认参数在对 Klass 的赋值后仍然存在。

但是,失败了:

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', [:]]

因此:

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

使用柯里化(Currying)闭包,默认参数值可以直接使用,但当闭包被指定为 Klass 的静态成员时,默认参数值会丢失。

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

最佳答案

如果问题仍然困扰着您,我认为这可能是一个解决方法,直到它在 groovy trunk 中得到修复。 Python curry 方法:

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

关于groovy - 使用 Expando 元类将柯里化(Currying)闭包添加为静态属性会丢失默认参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11585827/

相关文章:

java - 在 Java 中使用 Groovy 向类添加方法

hibernate - 碎石+方石

c# - C#中如何在非静态方法中调用静态方法

c++ - lambda 主体内的重载静态成员函数调用无法编译

python - 从/使用函数参数作为键和默认值作为值创建字典

Python 委托(delegate)函数调用中参数的默认值

java - 碧 Jade 报告 : CONCATENATE function not found

git - 与Grails和inPlace插件的持续集成(Jenkins)

c# - 在 NHibernate 中制作数据访问方法的最佳方法是什么?

c++ - 命名空间上的变量总是有默认值吗?