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