Перегрузка + оператор для массивов в Groovy - PullRequest
0 голосов
/ 14 декабря 2010

Я отличный новичок. Может быть, это легко, но я хочу перегрузить оператор + для массивов / списков, чтобы кодировать как это

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

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

1 Ответ

6 голосов
/ 14 декабря 2010

Я бы не рекомендовал глобально отвергать устоявшееся поведение.Но, если вы настаиваете, это будет сделано так, как вы просите:

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