D中可变长度的可变数组

时间:2014-05-07 14:16:10

标签: arrays syntax d immutability immutablearray

在D中是否有可能有一个可变数组,其长度在编译时是不知道的,具有静态长度?

void testf(size_t size) {
    int immutable([]) testv = new int[](a);
}

2 个答案:

答案 0 :(得分:4)

不,除非你提供自己的数组包装器,否则至少不会。你可以这样做:

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[]) {}
 }

注意禁用长度设置器和追加操作符,它几乎实现了你想要的东西。

            auto i = ImmutableLength([1,2,3]); // declare it like this

答案 1 :(得分:2)

您可以将本机数组类型包装在自定义类型中,从而限制对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
}