2010-12-14 62 views
0

我是一个时髦的新手。也许这是小菜一碟,但我想超载+运算符阵列/列表像这样的代码Groovy中的数组重载+运算符

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

assert [3,3,3] == a + b 
+0

什么是实际问题? – Puppy 2010-12-14 20:00:53

+0

我如何为列表重载+运算符? – JulioCM 2010-12-14 20:04:05

回答

6

我不会推荐全球覆盖完善的行为。但是,如果你坚持,这是不行的,你问:

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

一个更加本地化的替代方法是使用一个类别:

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] 
} 

不过,我可能会创建一个通用的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} 
+5

或'[[1,1,1],[2,2,2]]。转置()。collect {it.sum()}' – 2010-12-14 23:39:37

+5

@tim_yates - 尼斯,我没有考虑在那里使用sum。我想如果一个人想要真正的颓废,可以缩写为:[[1,1,1],[2,2,2]]。转置()*。sum() – Northover 2010-12-14 23:56:18

+0

+1 cool!很好的使用传播运算符:-) – 2010-12-15 00:20:50