d创建具有设定大小但未设定值的数组

原文
它必须是用户定义的.D中的内置数组要么是静态的,需要在编译时知道,要么是切片成动态数组,可以调整大小.

内置选项:

int length = 100;
int[] int_array = new int[length];
//==
int[] int_array;
int_array.length = length;

一般是编写纯函数,在可变数组中创建和设置内容,然后返回它.

pure int[] make_array(int length) {
    int[] array;
    array.length = length;
    foreach(i, ref item; array)
        item = i; // 简单初化
    return array;
}

// 用法:
immutable(int)[] arr = make_array(100); // 工作
immutable(int[]) iarr = make_array(100); //工作

纯函数返回的可变数据是,一般禁止隐式转换不变的例外:因为它来自纯函数,编译器知道它是唯一的引用,并且可安全地根据请求将其视为不变.
第1行和第2行用法区别在,第1行可以重新分配:

arr = something_else[]; /* cool */

第二行根本无法更改.
可用静态数组,但需要在编译时知道长度:

int[100] int_array = void;

总之,必须是用户定义类型:

struct MyArray(T) {
     @disable this(); // 禁止默认构造器
     // 运行时长为参
     this(size_t length) { backing = new T[length]; }
     private T[] backing = void; // 保存数据
     T[] opSlice() { return backing; } // 允许切片
     alias opSlice this; // 隐式转换
}

用法:

void main() {
    int length = 100; // runtime
    // MyArray!int uninitialized;
// 由于@disable this:编译错误
    MyArray!int uninitialized = void;
// 好,显式未初化
    uninitialized = MyArray!int(length);
// 创建
    auto my_array = MyArray!int(length);
// 创建
    // my_array.length = 20; // 不能调整
    // my_array ~= 1; // 

    int[] slice = my_array; // 可切片.
}

使用D中的包装器结构,可有选择启用和禁用底层类型功能,而不会降低效率.

posted @ 2022-10-15 18:15  zjh6  阅读(30)  评论(0)    收藏  举报  来源