best/proper way to declare constants ?
H. S. Teoh
hsteoh at quickfur.ath.cx
Thu Aug 5 15:26:33 UTC 2021
On Thu, Aug 05, 2021 at 03:09:13PM +0000, someone via Digitalmars-d-learn wrote:
> On Thursday, 5 August 2021 at 10:28:00 UTC, Steven Schveighoffer wrote:
>
> > H.S. Teoh, I know you know better than this ;) None of this is
> > necessary, you just need `rtValue` for both runtime and CTFE (and
> > compile time parameters)!
Haha, I haven't used this particular feature of D recently, so probably
my memory is failing me. ;-)
> > Now, the original question is about *associative arrays*, which are
> > a different animal. Those, you actually have to initialize using a
> > static constructor, and does indeed need both an enum and a static
> > immutable, as CTFE currently does not understand runtime AAs. This
> > is a huge issue since you do need silly things like the `if(__ctfe)`
> > statement you wrote, and keep an enum handy for those cases which is
> > identical to the static immutable. We really need to fix this.
>
> When you say "We really need to fix this" you mean that *eventually*
> associative-arrays will be available at compile-time ?
[...]
AA's are already available at compile-time. You can define them in CTFE
and pass them around as template arguments.
What doesn't work is initializing global static immutable AA's with
literals. Currently, you need this workaround:
struct Data { /* whatever you want to store here */ }
static immutable Data[string] aa;
shared static this() {
aa = [
"abc": Data(...),
"def": Data(...),
// ... etc.
];
}
Unfortunately, this also means you can't access the value of `aa` at
compile-time. So you need a separate enum in order to access AA values
at compile-time.
Full runnable example:
---------------
enum ctValue = [
"abc": 123,
"def": 456,
];
static immutable int[string] rtValue;
shared static this() {
rtValue = ctValue;
}
// Compile-time operations
enum x = ctValue["abc"];
enum y = ctValue["def"];
static assert(x == 123 && y == 456);
// Runtime operations
void main() {
assert(rtValue["abc"] == 123);
assert(rtValue["def"] == 456);
}
---------------
T
--
My father told me I wasn't at all afraid of hard work. I could lie down right next to it and go to sleep. -- Walter Bright
More information about the Digitalmars-d-learn
mailing list