You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gosu中用enum替代switch case遇编译错误,如何正确实现?

Gosu枚举替代Switch Case的正确实现方式

首先得明确:Gosu不支持Java那种在枚举常量内部直接实现抽象方法的语法,这就是你写的代码报unexpected token public的原因。不过我们可以用Gosu的闭包特性来实现你想要的“每个枚举状态对应不同行为”的逻辑,完美替代switch case。

方案一:给枚举添加行为闭包属性

这是最贴合你需求的实现方式,把每个状态对应的操作封装成闭包,注入到枚举常量中,然后提供统一的方法执行该行为:

enum Status {
  // 每个枚举常量传入对应的行为闭包
  INACTIVE( -> { 
    print("执行INACTIVE对应的操作")
    // 这里写你的具体业务逻辑
  } ),
  ACTIVE( -> { 
    print("执行ACTIVE对应的操作")
    // 这里写你的具体业务逻辑
  } ),
  UNKNOWN( -> { 
    print("执行UNKNOWN对应的操作")
    // 这里写你的具体业务逻辑
  } )

  // 存储每个枚举对应的行为
  private var _action: ()->void

  // 构造函数,初始化时传入闭包
  constructor(action: ()->void) {
    _action = action
  }

  // 对外提供统一的执行方法
  public function doSomething(): void {
    _action()
  }
}

调用方式

现在你完全可以替代原来的switch逻辑,直接调用枚举的方法即可:

var currentState = getState()
currentState.doSomething()

为什么这个方案可行?

Gosu对闭包的支持非常友好,这种方式既保留了枚举的类型安全,又实现了“不同状态不同行为”的逻辑,而且代码比switch更简洁、更易维护——如果后续要新增状态,只需要在枚举里添加新的常量和对应的闭包即可,不需要修改调用处的代码。

补充:如果行为需要参数怎么办?

如果你的操作需要传入参数,只需要调整闭包的签名即可,比如:

enum Status {
  INACTIVE( (param: String) -> { 
    print("INACTIVE操作,参数:${param}")
  } ),
  // ...其他枚举常量

  private var _action: (String)->void

  constructor(action: (String)->void) {
    _action = action
  }

  public function doSomething(param: String): void {
    _action(param)
  }
}

内容的提问来源于stack exchange,提问作者forgetaboutme

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:00:33