【发布时间】:2010-10-29 13:36:16
【问题描述】:
我想通过以下方式“破坏”Groovy 中的 plus 方法:
Integer.metaClass.plus {Integer n -> delegate + n + 1}
assert 2+2 == 5
我得到了 StackOverflowException(这并不奇怪)。
有没有办法在元类的闭包中使用“原始”加法?
【问题讨论】:
我想通过以下方式“破坏”Groovy 中的 plus 方法:
Integer.metaClass.plus {Integer n -> delegate + n + 1}
assert 2+2 == 5
我得到了 StackOverflowException(这并不奇怪)。
有没有办法在元类的闭包中使用“原始”加法?
【问题讨论】:
常规的惯用方法是保存对旧方法的引用并在新方法中调用它。
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
这实际上并没有那么好记录,我打算在今晚或明天发表一篇关于这个确切主题的博客文章:)。
【讨论】:
用这个“宠”加法:
Integer.metaClass.plus {Integer n -> delegate - (-n) - (-1)}
assert 2+2 == 5
毫不奇怪,在重载plus方法中使用'+'操作符会导致StackOverflow,需要使用'+'操作符以外的东西。
其他机制:使用 XOR 或一些位运算符魔法。
问候, 和平之火
【讨论】: