提问人:Dmitry E. 提问时间:10/8/2022 更新时间:10/8/2022 访问量:55
使用 curried 闭包重写 Groovy 元类 invokeMethod
Overriding Groovy metaclass invokeMethod with a curried closure
问:
Groovy 允许我们通过对象元类用闭包覆盖每个实例的 invokeMethod。这在常规闭包中可以正常工作,但是当我尝试使用咖喱闭包做同样的事情时,我遇到了一个问题:覆盖不起作用。
// Create closures
def invokeClosure1 = { String name, Object args ->
name
}
def invokeClosure2 = { String suffix, String name, Object args ->
"${name}$suffix"
}
def invokeClosure2Curried = invokeClosure2.curry('!')
assert invokeClosure2Curried.parameterTypes as List == [String, Object]
// Test closures
assert invokeClosure1('foo', null) == 'foo'
assert invokeClosure2Curried('foo', null) == 'foo!'
// Create an object
def s = 'Hello'
assert s.toUpperCase() == 'HELLO'
// Override instance metaclass invokeMethod with a regular closure
s.metaClass.invokeMethod = invokeClosure1
assert s.toUpperCase() == 'toUpperCase'
// Override instance metaclass invokeMethod with a curried closure
s.metaClass.invokeMethod = invokeClosure2Curried
assert s.toUpperCase() == 'toUpperCase!'
输出:
assert s.toUpperCase() == 'toUpperCase!'
| | |
| 'toUpperCase' false
'Hello'
最后一个断言失败。我在这里做错了什么吗?
答: 暂无答案
评论