说,我想添加两个向量(在数学意义上)的数值。当然,我会做一些事情,如:了解D语言中的参考
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
和b
,为我优化?我如何声明不变的方式(我试过immutable
关键字,看起来像我用错了)? res
会在变通方法中真正复制两次,还是通过移动进行返回?
如何工作并不'RES [] + = b [];'还努力消除环路? –
@ratchetfreak这似乎确实起作用,这会更好。我对数组向量操作不太熟悉,所以我不知道你能做什么,不能做什么。我尝试了一个[] + b []',这并没有奏效,并放弃了它。但是由于'res + = b []'有效,我会相应地更新我的答案。 –