使用 curried 闭包重写 Groovy 元类 invokeMethod

Overriding Groovy metaclass invokeMethod with a curried closure

提问人:Dmitry E. 提问时间:10/8/2022 更新时间:10/8/2022 访问量:55

问:

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'

最后一个断言失败。我在这里做错了什么吗?

Groovy Closures 元编程

评论


答: 暂无答案