Arrays D中长度不变的可变数组
在D中,一个可变数组的长度在编译时是未知的,是否可能有一个静态长度Arrays D中长度不变的可变数组,arrays,syntax,d,immutability,immutablearray,Arrays,Syntax,D,Immutability,Immutablearray,在D中,一个可变数组的长度在编译时是未知的,是否可能有一个静态长度 void testf(size_t size) { int immutable([]) testv = new int[](a); } 您可以将本机数组类型包装为自定义类型,以限制对length属性的访问: struct FixedLengthArray(T) { T[] arr; alias arr this; this(size_t size) { arr = new T[size]; }
void testf(size_t size) {
int immutable([]) testv = new int[](a);
}
您可以将本机数组类型包装为自定义类型,以限制对
length
属性的访问:
struct FixedLengthArray(T)
{
T[] arr;
alias arr this;
this(size_t size) { arr = new T[size]; }
@property size_t length() { return arr.length; }
}
void main()
{
auto arr = FixedLengthArray!int(10);
arr[1] = 1; // OK
arr[2..4] = 5; // OK
assert(arr.length == 10); // OK
arr.length = 12; // Error
}
不,至少不需要,除非您提供自己的数组包装器。你可以这样做:
struct ImmutableLength {
int[] array;
alias array this; // allow implicit conversion to plain array
this(int[] a) { array = a; } // initialization from plain array
@property size_t length() { return array.length; }
@disable @property void length(size_t) {}
@disable void opOpAssign(string op: "~", T)(T t) {}
@disable void opAssign(int[]) {}
}
请注意禁用的长度设置器和append操作符,它几乎实现了您想要的内容
auto i = ImmutableLength([1,2,3]); // declare it like this
但是
arr~=1
将编译并增加长度。顺便说一句,您可能还需要@disable opAssign(int[]rhs),因为我认为这也会发生。