在groovy中重载数组的运算符

0 groovy overloading operator-keyword

我是一个时髦的新手.也许这是小菜一碟,但我希望将数组/列表的+运算符重载为这样的代码

def a= [1,1,1]
def b= [2,2,2]

assert [3,3,3] == a + b 
Run Code Online (Sandbox Code Playgroud)

Nor*_*ver 6

我不建议全球覆盖既定的行为.但是,如果你坚持,这将按照你的要求行事:

ArrayList.metaClass.plus << {Collection b -> 
    [delegate, b].transpose().collect{x, y -> x+y}
}
Run Code Online (Sandbox Code Playgroud)

更加本地化的替代方案是使用类别:

class PlusCategory{
    public static Collection plus(Collection a, Collection b){
        [a, b].transpose().collect{x, y -> x+y}
    }
}
use (PlusCategory){
    assert [3, 3, 3] == [1, 1, 1] + [2, 2, 2]
}
Run Code Online (Sandbox Code Playgroud)

但是,我可能会创建一个通用的zipWith方法(如在函数式编程中),允许人们轻松指定不同的行为......

Collection.metaClass.zipWith = {Collection b, Closure c -> 
    [delegate, b].transpose().collect(c)
}
assert [3, 3, 3] == [1, 1, 1].zipWith([2, 2, 2]){a, b -> a+b}
assert [2, 2, 2] == [1, 1, 1].zipWith([2, 2, 2]){a, b -> a*b}
Run Code Online (Sandbox Code Playgroud)

  • 或者`[[1,1,1],[2,2,2]] .transpose().collect {it.sum()}` (5认同)
  • @tim_yates - 很好,我没有考虑在那里使用总和.我想如果一个人想要真正颓废,它可以缩写为:[[1,1,1],[2,2,2]] .transpose()*.sum() (5认同)