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

Jer*_*oen 2 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?
    **/
}
Run Code Online (Sandbox Code Playgroud)

Ada*_*ppe 5

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

void fillArray(ubyte[] array) {}
Run Code Online (Sandbox Code Playgroud)

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

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

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

void fillArray(ubyte* data, size_t length) {}
Run Code Online (Sandbox Code Playgroud)

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

并且您不能参考调整静态数组的大小,因为无论如何都不可能调整静态数组的大小!