说,我想添加两个数字的向量(在数学意义上)。我自然会做类似的事情:
T[] add(T)(T[] a, T[] b) {
assert(a.length == b.length);
T[] res = a.dup;
foreach (i; 0 .. a.length) {
res[i] = a[i] + b[i];
}
return res;
}
好吧,没关系,但我怀疑a
并b
复制每个电话,这不是很好。所以我宣布他们ref
。
T[] add(T)(ref T[] a, ref T[] b) { ...
它在传递变量时效果很好,但对于测试我使用数组实例:
assert(add([1, 2, 3], [4, 5, 6]) == [5, 7, 9]);
这失败了,因为它无法推断出数组的引用。我设法想出一个解决方法:
T[] add(T)(T[] a, T[] b) {
return add(a, b);
}
这似乎解决了问题,但看起来相当愚蠢。对于我的问题,更好的设计是什么?
或者把它变成更小的问题:我真的必须声明论点ref
以避免复制吗?由于我不修改a
and b
,编译器可以为我优化吗?顺便说一句,我如何声明参数不可变(我尝试了immutable
关键字,看起来我用错了)?在变通方法中真的会res
被复制两次,还是通过移动获得回报?