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}
Quelle est la vraie question? – Puppy
Comment je surcharge l'opérateur + pour les listes? – JulioCM