Enums - HimxhMC/HimDSL GitHub Wiki

enum 用户枚举 / User Enums

枚举是什么 / What an Enum Is

枚举定义一组有限的取值。例如"红绿蓝"、"上右下左"、"待机/运行/停止"。用枚举比用字符串更安全——拼错了会报错,不会静默失败。

An enum defines a finite set of values: red/green/blue, up/right/down/left, idle/running/stopped. Enums beat strings because typos error instead of failing silently.

对比:

Compare:

// 用字符串:拼错了不会报错,逻辑默默失效
string state = "runing";        // 少了一个 n
if (state == "running") { ... }  // 永远不成立

// 用枚举:拼错了直接报错
var state = State.RUNNING;
if (state == State.RUNING) { ... }  // ✗ 编译或运行时能发现

定义枚举 / Defining an Enum

语法:

Syntax:

enum 名称 {
    常量1,
    常量2,
    常量3,
};

例子:

Example:

enum State {
    IDLE,
    RUNNING,
    STOPPED,
};

结尾的分号不能省。逗号在最后一个常量后面可以省略,也可以保留:

The trailing semicolon is mandatory. The comma after the last constant is optional:

enum Color {
    RED,
    GREEN,
    BLUE        // 最后一个常量后可以不加逗号
};

使用枚举 / Using an Enum

用 枚举名.常量名 引用:

Reference with EnumName.CONSTANT:

State s = State.IDLE;
Color c = Color.RED;

也可以配合 var:

Or with var:

var s = State.RUNNING;
var c = Color.BLUE;

比较 / Comparison

枚举常量之间用 == 比较:

Compare constants with ==:

if (s == State.RUNNING) {
    runcmd("CONSOLE", "say 正在运行");
}

与字符串比较 / Comparison with Strings

用户枚举与字符串可以直接比较,这一点是特地为脚本场景设计的,读起来更自然:

User enums compare directly with strings, a script-friendly feature:

if (s == "RUNNING") {
    runcmd("CONSOLE", "say 正在运行");
}

上例等价于 if (s == State.RUNNING)。两种写法都合法,推荐用枚举常量形式——拼错会报错,更安全。

The above equals if (s == State.RUNNING). Both work; prefer the constant form for typo safety.


一个完整的例子 / A Complete Example

用枚举实现一个简单的状态机:

A simple state machine with an enum:

enum State {
    IDLE,
    ACTIVE,
    FINISHED,
};

State current;

void setState(State s) {
    current = s;
    runcmd("CONSOLE", "say 状态: " + s.toString());
}

int main() {
    setState(State.IDLE);
    setState(State.ACTIVE);
    setState(State.FINISHED);

    if (current == State.FINISHED) {
        runcmd("CONSOLE", "say 任务完成");
    }
}

toString 返回形如 State.FINISHED 的文本,方便打印。

toString returns text like State.FINISHED, easy to print.


内置方法 / Built-in Methods

用户枚举提供几个常用方法:

User enums provide a few common methods:

var c = Color.RED;

string name = c.name();         // "RED"
string type = c.type();         // "Color"
string text = c.toString();     // "Color.RED"
bool same = c.equals("RED");    // true
  • name() —— 常量名。

  • type() —— 枚举类型名。

  • toString() —— 类型名.常量名。

  • equals(x) —— 与常量名或另一个常量比较。

  • name() — the constant name.

  • type() — the enum type name.

  • toString() — TypeName.CONSTANT.

  • equals(x) — compare against a name or another constant.


与 Java 枚举的关系 / Relation to Java Enums

HimDSL 里的枚举大部分来自 Java,例如:

Most enums in HimDSL come from Java, e.g.:

Material.DIAMOND
GameMode.CREATIVE
WeatherType.CLEAR

这些是 Java 枚举,行为和你自己定义的 enum 类似,也支持 name()、toString()、与字符串比较。

These are Java enums. They behave like your own enum: name(), toString(), and string comparison work the same.

区别在于:Java 枚举可能提供额外的方法,比如 Material.isItem()、GameMode.getName()——这些方法在用户枚举里没有。

The difference: Java enums may offer extra methods like Material.isItem() or GameMode.getName() — user enums do not.


什么时候用枚举 / When to Use Enums

用枚举的场景 / Good for

  • 状态机:IDLE / RUNNING / DONE。

  • 固定选项:颜色、方向、难度。

  • 替代魔法字符串:避免 "running" 这种容易拼错的文本。

  • State machines: IDLE / RUNNING / DONE.

  • Fixed options: colors, directions, difficulty.

  • Replacing magic strings: avoid typo-prone "running".

不用枚举的场景 / Not for

  • 用户输入的文本:那是字符串,不是枚举。

  • 会动态增长的集合:枚举是编译期固定的。

  • 需要附加数据:枚举只存"是哪个常量",附加数据放到结构体里。

  • User-entered text: that is a string.

  • Dynamically growing sets: enums are fixed at declaration.

  • Extra data per value: put that in a struct.

默认用字符串,只有出现"有限集合"时再考虑枚举。不要在脚本里把什么都塞进枚举,那样反而更麻烦。

Default to strings. Consider an enum only for a finite set. Do not force every value into an enum; that makes scripts harder to maintain.


小结 / Summary

  • 定义:enum 名称 { 常量1, 常量2, ... };,结尾分号。

  • 引用:名称.常量。

  • 常量之间用 == 比较,也能与字符串比较。

  • 内置方法:name / type / toString / equals。

  • 用户枚举与 Java 枚举用法相似。

  • 适合固定、有限的取值集合,不适合动态数据。

  • Define: enum Name { A, B, ... }; with a trailing semicolon.

  • Reference: Name.CONSTANT.

  • Compare with ==; strings also work.

  • Built-ins: name / type / toString / equals.

  • User enums behave like Java enums.

  • Ideal for fixed, small sets; not for dynamic data.


下一步 / Next Steps

下一章 [Java 互操作 / Java-Interop] 介绍如何从脚本创建 Java 对象、调用静态方法、引用 Java 枚举。

Next, [Java 互操作 / Java-Interop] shows creating Java objects, calling static methods, and referencing Java enums from scripts.