On Monday, 30 November 2015 at 08:08:20 UTC, Meta wrote:
class WhiteKey
{
        private immutable int halfStepsToNext;
        private immutable int halfStepsToPrevious;

        enum
        {
                A = new WhiteKey(2, 2),
                B = new WhiteKey(2, 1),
                C = new WhiteKey(1, 2),
                D = new WhiteKey(2, 2),
                E = new WhiteKey(2, 1),
                F = new WhiteKey(1, 2),
                G = new WhiteKey(2, 2),
        }
        
        private this(int halfStepsToPrevious, int halfStepsToNext)
        {
                this.halfStepsToPrevious = halfStepsToPrevious;
                this.halfStepsToNext = halfStepsToNext;
        }
}

However, you do NOT want to do this, as everywhere you use WhiteKey's members, a new object will be created. For example:

auto f = WhiteKey.A;
auto n = WhiteKey.A;
        
import std.stdio;
writeln(&f, " ", &n);


You're misinterpreting this:

    enum X {
        A = new Object,
        B = new Object,
    }

    void main() {
        import std.stdio;
        writeln(cast(void*) X.A);
        writeln(cast(void*) X.A);
    }

# output:
470910
470910

You're print the address of `f` and `n` on the stack, not the reference they're pointing to.

But it's true that enums of mutable _arrays_ do create a new instance every time they're used:

    enum X {
        A = [1,2,3],
        B = [4,5,6],
    }

    void main() {
        import std.stdio;
        writeln(X.A.ptr);
        writeln(X.A.ptr);
    }

# output:
7FD887F0E000
7FD887F0E010

Reply via email to