Как вы инициализируете массив значений const в D2? - PullRequest
4 голосов
/ 02 сентября 2010

По сути, я хочу иметь возможность сделать что-то вроде этого:

struct Foo
{
  const(int)[2] ints;

  this(int x, int y)
  {
    ints = [x, y];
  }
}

, но это не работает.Компилятор (DMD 2.048) просто жалуется, что ints не является изменяемым.

Как вы должны инициализировать массив?

1 Ответ

1 голос
/ 02 сентября 2010

Один из способов реализовать конструктор - это:

  this(int x, int y) 
  {
    auto i2 = cast(int[2]*)&ints;
    *i2 = [x, y];
  }

const только для чтения, поэтому конструктор создает изменяемое представление i2 и присваивает ему. Мне действительно не нравится приведение в первой строке, возможно, в std lib есть какая-то функция, которая инкапсулирует приведение и удаляет модификатор const из типа переменной, так что это можно выразить в безопасной и идиоматической форме.

Второй способ - сделать ints изменяемым и приватным, а затем предоставить общедоступную функцию доступа:

struct Foo {

  private int[2] _ints;

  this(int x, int y) {
      _ints = [x, y];
  }

  @property ref const(int)[2] ints () {
      return _ints;
  }
}

Компилятор может включить его.

...