2.8.5 Enum abstracts
since Haxe 3.1.0
By adding the :enum
metadata to an abstract definition, that abstract can be used to define finite value sets:
@:enum
abstract HttpStatus(Int) {
var NotFound = 404;
var MethodNotAllowed = 405;
}
class Main {
static public function main() {
var status = HttpStatus.NotFound;
var msg = printStatus(status);
}
static function printStatus(status:HttpStatus) {
return switch(status) {
case NotFound:
"Not found";
case MethodNotAllowed:
"Method not allowed";
}
}
}
The Haxe Compiler replaces all field access to the HttpStatus
abstract with their values, as evident in the JavaScript output:
Main.main = function() {
var status = 404;
var msg = Main.printStatus(status);
};
Main.printStatus = function(status) {
switch(status) {
case 404:
return "Not found";
case 405:
return "Method not allowed";
}
};
This is similar to accessing variables declared as inline, but has several advantages:
- The typer can ensure that all values of the set are typed correctly.
- The pattern matcher checks for exhaustiveness when matching an enum abstract.
- Defining fields requires less syntax.