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中的包装器结构,可有选择地启用和禁用底层类型功能,而不会降低效率.
浙公网安备 33010602011771号