6
我在Groovy 1.8.6和2.0.0中都遇到了这个问题。使用expando元类添加curried closure作为静态属性失去默认参数值
所以这些方案预期的所有工作:
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, [:]]
默认参数不安的关闭仍然存在于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]
使用curried闭包时,默认参数值直接起作用,但当闭包分配为Klass
的静态成员时会丢失。
这个好像是就像一个bug。我无法在任何地方找到这种行为。我错过了什么吗?
我看到了同样的行为。我也测试了它作为一个类实例方法(所以它可以通过'Klass.metaClass.ayprimemethod << ayprime; assert new Klass()。ayprimemethod()== ['PRIME',[:]]')来测试,并发现相同的问题。看起来你应该[在JIRA中提交一个bug](http://jira.codehaus.org/secure/BrowseProject.jspa?id=10242)。 – OverZealous 2012-07-21 04:52:40
完成。 http://jira.codehaus.org/browse/GROOVY-5621 – 2012-07-23 15:37:07
感谢您对currying的解释:) – 2012-07-23 19:49:37