Thread overview
Initializing an associative array into a variable when it is created
Jul 15, 2023
Alexander Zhirov
Jul 15, 2023
Danilo
Jul 16, 2023
Alexander Zhirov
Jul 16, 2023
Danilo
Jul 16, 2023
Alexander Zhirov
Jul 15, 2023
Danilo
July 15, 2023

I still don't understand how to make this entry correct. I have a static array that I want to use exactly as an array (the structure doesn't quite fit):

string[][string] arr = [
    "one": ["abc", "def"],
    "two": ["ghi", "jkl"],
    "three": ["mno", "pqr"]
]

There are the same number of elements everywhere (in the internal array).

July 15, 2023

Works fine, if you add a semicolon at the end.

import std.stdio;

void main() {
    string[][string] arr = [
        "one": ["abc", "def"],
        "two": ["ghi", "jkl"],
        "three": ["mno", "pqr"]
    ];
    writeln(arr);
    writeln(arr["two"]);
    writeln(arr["two"][0]);
}
July 15, 2023

On Saturday, 15 July 2023 at 23:24:27 UTC, Alexander Zhirov wrote:

>

There are the same number of elements everywhere (in the internal array).

Sorry, forgot that part.

Just add the size of the internal array (2 in this case):

    string[2][string] arr = [
        "one": ["abc", "def"],
        "two": ["ghi", "jkl"],
        "three": ["mno", "pqr"]
    ];
July 16, 2023

On Saturday, 15 July 2023 at 23:34:22 UTC, Danilo wrote:

>

Works fine, if you add a semicolon at the end.

I'm sorry. I didn't put the question quite correctly. Yes, this is how the array is initialized. I'm trying to describe it all in a class. I.e. I need to create a variable in the class that will be initialized when creating an object. I understand that it needs to be described in the constructor. But is there really no other way to immediately point a static array to a variable?

July 16, 2023
>

But is there really no other way to immediately point a static array to a variable?

Looks like this is not implemented yet:

Would a static constructor be okay? This way the static data
is not initialized at every new and object creation is faster.

import std.stdio;

class C {
    static string[][string] arr;

    static this() { // static constructor
        arr = [
            "one": ["abc", "def"],
            "two": ["ghi", "jkl"],
            "three": ["mno", "pqr"]
        ];
    }

    this() { // object constructor
    }

    void show(string value) {
        writeln(
            value,
            ": ",
            arr[value],
            ": ",
            arr[value][0],
            ", ",
            arr[value][1]
        );
    }
}

void main() {
    auto var = new C;
    var.show("one");
    var.show("two");
    var.show("three");
}
July 16, 2023

On Sunday, 16 July 2023 at 11:16:55 UTC, Danilo wrote:

>

Would a static constructor be okay? This way the static data
is not initialized at every new and object creation is faster.

Alternatively, i can think about your proposal. At the moment, I have solved my problem using the following method:

@property string[][string] arr() {
    return [
        "one": ["abc", "def"],
        "two": ["ghi", "jkl"],
        "three": ["mno", "pqr"]
    ];
}

I don't know how true it will be considered. After all, the function creates an array every time it is called, which is not correct.