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 @   zjh6  阅读(10)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示