【发布时间】:2019-01-28 08:24:19
【问题描述】:
根据 D 语言参考static initialization of associative arrays 可以这样初始化关联数组 (AA):
immutable long[string] aa = [
"foo": 5,
"bar": 10,
"baz": 2000
];
void main()
{
import std.stdio : writefln;
writefln("(aa = %s)", aa);
}
但是,该示例无法使用合理的最新 DMD 进行编译:
$ dmd --version
DMD64 D Compiler v2.083.0
Copyright (C) 1999-2018 by The D Language Foundation, All Rights Reserved written by Walter Bright
$ dmd -de -w so_003.d
so_003.d(3): Error: non-constant expression ["foo":5L, "bar":10L, "baz":2000L]
谷歌搜索似乎表明这是该语言中长期存在的错误(?):
- Cannot initialize associative array
- What is the syntax for declaring a constant string[char] AA?
- Error in Defining an associative array in D
所以我知道如何使用static constructor 解决这个问题。但是考虑到这个问题已经存在了大约 10 年,这在实践中会变成一个特性吗?
事实上,这只是我实际问题的前奏:
是否可以在编译时初始化关联数组?
在下面的示例中,我可以使用在编译时运行的生成器函数(使用 CTFE)初始化模块级别 string[] doubleUnits,正如 pragma(msg) 所证明的那样。我可以在运行时初始化int[string] doubleUnitMap。但是如何在编译时初始化 AA?
import std.stdio : writefln;
immutable char[] units = ['a', 'b', 'c'];
immutable string[] doubleUnits = generateDoubleUnits(units);
pragma(msg, "compile time: ", doubleUnits);
string[] generateDoubleUnits(immutable char[] units)
pure
{
import std.format : format;
string[] buffer;
foreach(unit; units) {
buffer ~= format("%s%s", unit, unit);
}
return buffer;
}
immutable int[string] doubleUnitMap;
// pragma(msg) below triggers the following compilation error:
// Error: static variable doubleUnitMap cannot be read at compile time
// while evaluating pragma(msg, "compile time: ", doubleUnitMap)
// pragma(msg, "compile time: ", doubleUnitMap);
shared static this() {
doubleUnitMap = generateDoubleUnitMap(units);
}
int[string] generateDoubleUnitMap(immutable char[] units)
pure
{
import std.format : format;
int[string] buffer;
foreach(unit; units) {
string key = format("%s%s", unit, unit);
buffer[key] = 1;
}
return buffer;
}
void main()
{
writefln("(doubleUnits = %s)", doubleUnits);
writefln("(doubleUnitMap = %s)", doubleUnitMap);
}
【问题讨论】:
标签: d