enum 枚举声明
语法
- export? enum 标识符 { 枚举项列表1 }
注释:
-
枚举项列表的语法:
- 枚举项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