2014-11-11 2 views

ответ

6

Вы можете инициализировать ассоциативные константы массива внутри конструктора модуля:

const /+ or immutable +/ (string [char]) AA1; 
static this() { 
    AA1 = [ 
     'a' : "fkclopel", 
     'b' : "poehfftw" 
    ]; 
} 

import std.stdio; 
void main() {writeln (AA1);} 

manual section на ассоциативных литералов массива прямо говорится, что «AssocArrayLiteral не может быть использован для статически инициализировать что-либо», хотя это не дать понять, почему это так.

+7

Причина в том, что в текущей реализации (которая субоптимальна несколькими способами) ассоциативный макет массива и другие детали полностью непрозрачны для компилятора. Литерал AA просто вызывает функцию времени выполнения (файл src/druntime/src/rt/aaA.d, function _d_assocarrayliteralTX), который отвечает за фактическую организацию данных. Эта функция может отсутствовать даже во время компиляции, связавшись позже с бинарной библиотекой. Поскольку статические данные нуждаются в известном макете, поэтому компилятор может поместить его в сегмент данных исполняемого файла, и эта функция является черным ящиком, и для этого не может быть использована. –

+1

Следует отметить, что это ограничение, в конечном счете, исчезнет, ​​когда будет реализована сплошная реализация библиотеки ассоциативных массивов. В настоящее время идет работа над этим, что, похоже, приближается к завершению. – Meta

Смежные вопросы