5

我想通过以下方式“破坏”Groovy 中的 plus 方法:

Integer.metaClass.plus {Integer n -> delegate + n + 1}
assert 2+2 == 5

我收到 StackOverflowException (这并不奇怪)。

有没有办法在元类的闭包中使用“原始”加法?

4

2 回答 2

7

常规的惯用方法是保存对旧方法的引用并在新方法中调用它。

def oldPlus = Integer.metaClass.getMetaMethod("plus", [Integer] as Class[])

Integer.metaClass.plus = { Integer n ->
    return oldPlus.invoke(oldPlus.invoke(delegate, n), 1)        
}

assert 5 == 2 + 2

这实际上并没有那么好记录,我打算在今晚或明天发表一篇关于这个确切主题的博客文章:)。

于 2009-05-29T05:04:54.903 回答
1

用这个来“宠”加法:

Integer.metaClass.plus {Integer n -> delegate - (-n) - (-1)}
assert 2+2 == 5

毫不奇怪,在重载 plus 方法中使用 '+' 运算符会导致 StackOverflow,它需要使用除 '+' 运算符之外的其他东西。

其他机制:使用 XOR 或一些位运算符魔术。

问候, 和平之火

于 2009-05-28T19:37:42.783 回答