我是一个时髦的新手。也许这是小菜一碟,但我想重载数组/列表的 + 运算符以编写这样的代码
def a= [1,1,1]
def b= [2,2,2]
assert [3,3,3] == a + b
我是一个时髦的新手。也许这是小菜一碟,但我想重载数组/列表的 + 运算符以编写这样的代码
def a= [1,1,1]
def b= [2,2,2]
assert [3,3,3] == a + b
我不建议在全球范围内覆盖完善的行为。但是,如果您坚持,这将按照您的要求进行:
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}