Can static variables in methods be local for each object?
bauss
jj_1337 at live.dk
Wed Jul 21 06:52:58 UTC 2021
On Tuesday, 20 July 2021 at 15:59:30 UTC, Dukc wrote:
> 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
> }
> ```
Wait, that's not too shabby to use the this pointer for a key to
an AA.
It isn't really a single static variable however, but rather an
AA that contains the static variables.
More information about the Digitalmars-d-learn
mailing list