接受任何大小的静态数组的函数(D)

时间:2013-11-23 18:16:41

标签: arrays d dynamic-arrays static-array

如何创建支持任何大小的静态数组的函数?

类似的东西:

@safe pure nothrow void fillArray(ref ubyte[] array) {
    /**
     * How do I make this function support arrays of any
     * size; but they don't have to be dynamic?
    **/
}

2 个答案:

答案 0 :(得分:5)

棘轮怪人在评论中说道,但我也会把它作为答案。解决方案是使用常规切片:

void fillArray(ubyte[] array) {}

然后可以毫不费力地将静态数组传递给它,当然,你仍然可以将它们切片以仅传递一部分。

int[4] foo;
fillArray(foo); // ok, passes the whole thing
fillArray(foo[0 .. 2]); // passes only the first two

如果你附加到fillArray中的切片,那可能会破坏,因为附加到切片会重新分配它 - 因为它不是ref,你可以改变内容,但不能改变地址或长度。将切片视为指针+长度对:

void fillArray(ubyte* data, size_t length) {}

你可以改变*数据,数据[0],数据[1]等填充内容,但是如果你改变了长度或指针本身,那么在函数外部将看不到,除非参考当然,就像更改函数中的任何其他int值一样。

你不能重新调整静态数组的大小,因为无论如何都不可能调整静态数组的大小!

答案 1 :(得分:3)

您需要做的是从论证中删除ref。当你使用引用时,这意味着当你在函数内部调整数组大小时,它也会在函数外部调整大小,这对于静态数组来说显然是不可能的。

如果不使用ref,仍可以编辑数组内容。但是,在调整数组大小时,只会使用新长度更新数组指针的本地副本。本地副本的大小不同;原始指针仍然具有原始大小。

如果你对数组进行切片,它也可以工作,因为函数得到的引用无论如何都是对数组切片的新引用;它不等于原始参考。