2.7.5 열거 추상(Enum abstracts)
2.7.5 열거 추상(Enum abstracts)
Haxe 3.1.0 이후 — 추상 정의에
@:enum메타데이터를 추가하면, 그 추상으로 유한한 값의 집합을 정의할 수 있어요:
@: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";
}
}
}
Haxe 컴파일러는 HttpStatus 추상에 대한 모든 필드 접근을 그 값으로 대체합니다. JavaScript 출력에서 확인할 수 있어요:
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";
}
};
이것은 인라인으로 선언된 변수에 접근하는 것과 비슷하지만 몇 가지 장점이 있어요:
- 타입 검사기가 집합의 모든 값이 올바르게 타입 지정되었는지 확인할 수 있습니다.
- 패턴 매처는 열거 추상을 매칭할 때 철저성(exhaustiveness)을 검사합니다.
- 필드 정의에 더 적은 문법이 필요해요.
Haxe 4.0.0 이후 — 열거 추상은
@:enum메타데이터 없이, 더 자연스러운 문법enum abstract로 선언할 수 있어요. 또한 기반 타입이String이나Int라면 열거 case의 값을 생략할 수 있고 컴파일러가 추론합니다:
Int추상의 경우, 추론된 값은 마지막 사용자 정의 값을 1씩 증가시키며, 아무 값도 선언되지 않았으면 0에서 시작합니다.String추상의 경우, 추론된 값은 열거 case의 식별자입니다.
enum abstract Numeric(Int) {
var Zero; // implicit value: 0
var Ten = 10;
var Eleven; // implicit value: 11
}
enum abstract Textual(String) {
var FirstCase; // implicit value: "FirstCase"
var AnotherCase; // implicit value: "AnotherCase"
}
출처: Enum abstracts
본문
@:enum 추상의 개념
@:enum 메타데이터를 붙인 추상은 유한한 값 집합을 정의해요. 각 필드는 상수 값을 가지며, 컴파일러가 접근을 값으로 대체합니다. 기반 타입이 Int라면 각 case의 값이 실제 정수로 치환돼요.
장점
열거 추상은 인라인 변수 접근과 비슷하지만, 값의 타입 검사, 패턴 매칭의 철저성 검사, 더 간결한 문법이라는 장점이 있어요.
Haxe 4의 변화
Haxe 4.0.0부터는 enum abstract 문법으로 더 자연스럽게 선언할 수 있고, Int/String 기반 타입에서는 값을 생략할 수 있어요. 컴파일러가 마지막 값에서 1씩 증가시키거나(Int), case 식별자를 값으로 사용합니다(String).