跳到主要内容
版本:release

enum 枚举声明

语法

  • export? enum 标识符 { 枚举项列表1 }

注释:

  1. 枚举项列表的语法:

    • 枚举项2 (, 枚举项)* ,?
  2. 枚举项的语法:

    • 标识符 (= 整数字面量)? (: "字符串字面量")?

描述

enum 用于声明一个枚举类型,枚举类型是一种用户自定义的值类型,枚举类型的变量可以取预定义的有限个值中的一个。

在枚举声明中,每一个枚举项可以使用 = 指示其对应的整数值,如果没有使用 = 指定,则该枚举项的值为前一项的值 +1(首个枚举 项的默认值是 0)。

每一个枚举项可以使用 : 后跟一个字符串字面量,用于指示枚举项的描述信息。这些描述信息可以从 __memo__ 中提取(见下文)。

从技术上说,任何枚举类型均可容纳任意的 int 值,这意味着一些场景下,枚举项被定义为掩码的位,枚举变量被用于储存多个枚举项的 组合值。

枚举常量

在声明枚举时,实际上同时声明了枚举的类型和一个容纳枚举信息的同名 map 常量,该常量以枚举项的标识符为键,枚举项的值为值。

enum Color
{
RED_ = 1,
GREEN = 2,
BLUE = 4,
}

writeln(Color.RED_); // 输出 Color.RED_(1) @ /___.gs
writeln((int)Color.RED_); // 输出 1

在上述例子中,表达式 Color.RED_ 表达的含义,就是通过 索引表达式 从常量 Color 中取 出名为 RED_ 的枚举项的值。

除了储存枚举项的值之外,常量 map 中还储存有 __reverse_enum_map____memo__

  • __reverse_enum_map__ 储存反向的映射表,其键为枚举项的常量值,值为枚举项的名称。
  • __memo__ 储存枚举项的描述信息,其键为枚举值,值为描述信息。
enum Color
{
RED_ = 1 : "It's RED",
GREEEN = 2,
BLUE = 4,
}

string name = Color.__reverse_enum_map__[1];
writeln(name); // 输出 RED_

string memo = Color.__memo__[Color.RED_];
writeln(memo); // 输出 It's RED

writeln(Color);
/*
Color 的完整内容如下:
{
"__reverse_enum_map__" : {
1 : "RED_",
2 : "GREEEN",
4 : "BLUC",
},
"__memo__" : {
Color.RED_(1) @ /___.gs : "It's RED",
},
"RED_" : Color.RED_(1) @ /___.gs,
"GREEEN" : Color.GREEEN(2) @ /___.gs,
"BLUE" : Color.BLUE(4) @ /___.gs,
}
*/

需要注意的是,如果多个枚举项具有相同的整数值,则 __reverse_enum_map____memo__ 中仅储存最后一个枚举项的信息。


如果需要使用其他脚本中定义的枚举,需要使用:

// a.gs
enum Color
{
RED_ = 1,
GREEN = 2,
BLUE = 4,
}

// b.gs
import .a;

writeln(a.Color.RED_); // 输出 Color.RED_(1) @ /a.gs

如上所示,a.Color.RED_ 用于访问脚本 a.gs 中定义的枚举 Color 的枚举项 RED_。其中,a.Color 旨在访问脚本 a.gs 中定义的常量 Color

导出枚举

一些常量如果切实非常常用,不希望从脚本名开始访问,可以使用 export 关键字导出该枚举:

// a.gs
#pragma parallel
#pragma default_object

export enum Color
{
RED_ = 1,
GREEN = 2,
BLUE = 4,
}

// b.gs
import .a;

writeln(Color.RED_); // 直接输出 Color.RED_(1) @ /a.gs

需要注意,导出枚举只能在被标注为 #pragma default_object 的脚本中使用。

枚举类型转换

从枚举转换到 int,或从 int 转换到枚举均需要使用显示转换(强制类型转换):

enum Color
{
RED_ = 1,
GREEN = 2,
BLUE = 4,
}

Color c = Color.RED_;
int v = (int)c; // 从枚举转换到 int
writeln(v); // 输出 1

int n = 2;
Color c2 = (enum Color)n; // 从 int 转换到枚举
writeln(c2); // 输出 Color.GREEN(2) @ /___.gs

出于规避语法冲突的考虑,显示类型转换时,枚举类型需要使用 enum 关键字修饰。

示例

enum Fruit {
APPLE = 1 : "Red fruit",
BANANA = 2 : "Yellow fruit",
ORANGE = 3 : "Orange fruit"
}

// 访问枚举值
writeln(Fruit.APPLE); // 输出 Fruit.APPLE(1) @ /___.gs
writeln((int)Fruit.APPLE); // 输出 1

// 使用反向映射
string fruitName = Fruit.__reverse_enum_map__[2];
writeln(fruitName); // 输出 BANANA

// 获取描述信息
string memo = Fruit.__memo__[Fruit.APPLE];
writeln(memo); // 输出 Red fruit

// 类型转换示例
int value = 3;
Fruit f = (enum Fruit)value;
writeln(f); // 输出 Fruit.ORANGE(3) @ /___.gs

// 枚举组合使用(位标志)
enum Permissions {
READ = 1,
WRITE = 2,
EXECUTE = 4
}

Permissions userPerms = Permissions.READ | Permissions.WRITE;
writeln(userPerms); // 输出 Permissions.READ(1) | Permissions.WRITE(2) @ /___.gs
writeln((int)userPerms); // 输出 3