Initialising invariant associative array

Gide Nwawudu gide at btinternet.com
Wed Jun 18 04:30:03 PDT 2008


On Wed, 18 Jun 2008 10:21:05 +0200, David Ferenczi
<raggae at ferenczi.net> wrote:

>The following code gives the following compilation error:
>
>src/test/test.d(13): Error: non-constant expression ["s1":cast(FOO
>9223372036854775808LU,"s2":cast(FOO)4611686018427387904LU]
>src/test/test.d(14): Error: non-constant expression [cast(FOO
>9223372036854775808LU:"s1",cast(FOO)4611686018427387904LU:"s2"]
>
>
>--------------------------8<------------------------------------
>import std.stdint: uint_fast64_t;
>
>class A
>{
>    typedef uint_fast64_t FOO;
>
>    static invariant FOO fooValue1 = cast(FOO) 0x8000000000000000LU;
>    static invariant FOO fooValue2 = cast(FOO) 0x4000000000000000LU;
>
>    static invariant FOO[string] fooArray =
>["s1":fooValue1, "s2":fooValue2];
>    static invariant string[FOO] strArray = [fooValue1:"s1",
>fooValue2:"s2"];
>}
>
>int main(string[] args)
>{
>    A a;
>
>    return 0;
>}
>--------------------------8<------------------------------------
>
>Can somebody explain me why?
>
>Thanks,
>David

D uses 'static this' to initialise static members. This is done to
remove order of evaluation issues. The docs contain more info on
static constructors, see http://www.digitalmars.com/d/2.0/class.html
section 'Static Constructors'.

import std.stdint: uint_fast64_t;

class A
{
    typedef uint_fast64_t FOO;

    static invariant FOO fooValue1;
    static invariant FOO fooValue2;

    static invariant FOO[string] fooArray;
    static invariant string[FOO] strArray;

    static this() {
        fooValue1 = cast(FOO) 0x8000000000000000LU;
        fooValue2 = cast(FOO) 0x4000000000000000LU;
    
        fooArray = ["s1":fooValue1, "s2":fooValue2];
        strArray = [fooValue1:"s1", fooValue2:"s2"];
    }
}

int main(string[] args)
{
    A a;

    return 0;
}


Gide


More information about the Digitalmars-d-learn mailing list