On Tuesday, 20 July 2021 at 09:24:07 UTC, Mark Lagodych wrote:
Is there a way to make myvar local to each instance of `X` without making it a variable of `X`? Just curious.

Yes.

```d
import std.stdio;

class X {
    int x(int param) {
        static int[typeof(this)] myvar;

        if (param == 0) return myvar.get(this, 1234);
        else return myvar[this] = param;
    }

}

void main()
{
    X x1 = new X;
    X x2 = new X;

    x1.x(0).writeln; //1234
    x2.x(0).writeln; //1234

    x1.x(17).writeln; //17
    x2.x(0).writeln; //1234

    x1.x(0).writeln; //17
    x2.x(0).writeln; //1234
}
```

However, this is definitely not recommended. When you are calling a function with any particular object and argument set, you want it to do the same thing and return the same result, regardless of what's called before. Otherwise you're making debugging much more difficult than it needs to be.

This means that `static` variables should generally be used only for two things: 1: data that is only set at the beginning of the program, or at first use, and then left to the initial value. 2: caching results of expensive computation. Even this is a bit controversal, as it's easy to screw up - often it's just better to split the function in two, and let the caller to cache the results.

In this case, consider passing `myvar` explicitly:

```d
import std.stdio;

class X {
    int x(int param, ref int[typeof(this)] myvar) {
        if (param == 0) return myvar.get(this, 1234);
        else return myvar[this] = param;
    }

}

void main()
{
    X x1 = new X;
    X x2 = new X;
    int[X] myvar;

    x1.x(17, myvar).writeln; //17
    x2.x(0, myvar).writeln; //1234

    x1.x(0, myvar).writeln; //17
    x2.x(0, myvar).writeln; //1234

    myvar = null; //Forget all calls made so far
    x1.x(0, myvar).writeln; //1234
    x2.x(0, myvar).writeln; //1234
}
```

Reply via email to