2010-12-14 91 views
0

Je suis un novice groovy. Peut-être cela est un morceau de gâteau, mais je veux surcharger l'opérateur + pour les tableaux/listes de code comme ceciSurcharge + opérateur pour les tableaux dans groovy

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

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

Quelle est la vraie question? – Puppy

+0

Comment je surcharge l'opérateur + pour les listes? – JulioCM

Répondre

6

Je ne recommanderais pas globalement primordial des comportements bien établis. Mais, si vous insistez, cela fera que vous demandez:

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

Une alternative plus localisée serait d'utiliser une catégorie:

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

Cependant, je ne serais probablement créer une méthode zipWith générique (comme en programmation fonctionnelle), permettant de spécifier facilement différents comportements ...

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

Ou '[[1, 1, 1], [2, 2, 2]]. Transpose(). Collect {it.sum()}' –

+5

@tim_yates - Bien, je n'avais pas envisagé d'utiliser la somme là. Je suppose que si l'on voulait être vraiment décadent, il pourrait être abrégé à: [[1, 1, 1], [2, 2, 2]]. Transpose() *. Sum() – Northover

+0

+1 cool! Belle utilisation de l'opérateur de propagation :-) –