Возможно ли заполнить массив или ассоциативный массив неизменяемых объектов во время выполнения в D? У меня есть набор неизменных определений, данные которых считываются из внешнего источника во время выполнения. Каждое определение также содержит массивы нескольких других неизменяемых объектов. Однако, похоже, компилятор запрещает создавать неизменяемые массивы с использованием петель. В этом примере (поле данные упрощенно):Заполнение массива/вспомогательного массива неизменяемых объектов во время выполнения
immutable class Definition {
string name;
int size;
immutable(Field)[string] fields;
immutable class Field {
int num;
this (int num) {
this.num = num;
}
}
this(string name, int size) {
this.name = name;
this.size = size;
foreach (i; 0..size) {
string key = [cast(char)('a' + i)]; // a, b, c...
auto field = new immutable(Field)(i);
fields[key] = field; // ERROR
}
}
}
class Instance {
Definition def;
void speak() {
writefln("I am currently referencing definition '%s' (%d)", def.name, def.size);
}
}
auto defA = new immutable(Definition)("AAA", 4);
auto defB = new immutable(Definition)("BBB", 6);
auto instance = new Instance();
instance.def = cast(Definition) defA;
instance.speak();
instance.def = cast(Definition) defB;
instance.speak();
Я получаю Ошибки: инициализация неизменяемого поля «поле» не допускаются в петлях или после того, как этикетки. Есть ли способ обойти это или лучше сделать это? Или я об этом ошибаюсь?
Это именно то, что я хотел, спасибо! – ccjuju