enum behaivor. another rehash of the topic

bearophile bearophileHUGS at lycos.com
Sat Dec 14 17:52:00 PST 2013


Joseph Rice:

> import std.stdio;
>
> void main() {
> 	enum TEST {
> 		test1=0,
> 		test2
> 	};
>
> 	TEST test = TEST.test1;
> 	
> 	switch (test) {
> 		case TEST.test1:
> 			writeln("It's test1");
> 			break;
> 		case TEST.test2:
> 			writeln("It's test2");
> 			break;
> 		default:
> 		break;
> 	}
> }

This is how you usually write that code in D:


void main() {
     import std.stdio;

     enum Test { t1, t2 }
     auto test = Test.t1;

     final switch (test) with (Test) {
         case t1:
             writeln("It's t1");
             break;
         case t2:
             writeln("It's t2");
             break;
     }
}


The differences:
- The import is often better in the function.
- Type names (like Test) are better written with just the first 
letter uppercase.
- You often have to carry the type name around, so using shorter 
names is sometimes OK (like t1 and t2).
- In this code you want a final switch.
- Using with() you avoid repeating the enum type name.

In D you also have anonymous enums:

enum { test1, test2 }

Also, when you refer to C++, it's better to use the "enum class" 
of C++11.

D enums have some faults, like being weakly typed, having bad 
error messages, and sometimes being a bit too much long to write 
(when you pass an enum to a function, the function already knows 
the name of the enum type. But this is not so bad...).

Bye,
bearophile


More information about the Digitalmars-d mailing list