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

如何在Dart中编写递归枚举?附Swift示例代码参考

在Dart中实现Swift递归枚举逻辑

Swift里的Op是简单枚举,Expr是带递归关联值的枚举。由于Dart原生枚举不支持带递归关联值的定义,我们可以通过抽象类+子类的方式完全复刻原逻辑,具体实现如下:

1. 实现Op枚举

对应Swift的Op,Dart直接定义枚举即可:

enum Op {
  add,
  sub,
  mul,
  div,
}

2. 实现递归Expr结构

Dart枚举无法处理自身类型的关联值引用,因此用抽象基类模拟枚举的顶层类型,再用子类对应原枚举的不同case:

// 抽象基类,对应Swift的Expr枚举
abstract class Expr {}

// 对应Swift的Expr.Value(Int)
class ValueExpr extends Expr {
  final int value;

  ValueExpr(this.value);
}

// 对应Swift的indirect Expr.App(Op, Expr, Expr)
class AppExpr extends Expr {
  final Op op;
  final Expr left;
  final Expr right;

  AppExpr(this.op, this.left, this.right);
}

使用示例

可以像Swift中一样构建递归表达式:

void main() {
  // 构建表达式: 2 + (3 * 4)
  final expr = AppExpr(
    Op.add,
    ValueExpr(2),
    AppExpr(Op.mul, ValueExpr(3), ValueExpr(4)),
  );
}

如果想让调用方式更贴近Swift枚举的体验,还可以给抽象基类添加工厂构造函数:

abstract class Expr {
  factory Expr.value(int value) = ValueExpr;
  factory Expr.app(Op op, Expr left, Expr right) = AppExpr;
}

class ValueExpr extends Expr {
  final int value;

  ValueExpr(this.value);
}

class AppExpr extends Expr {
  final Op op;
  final Expr left;
  final Expr right;

  AppExpr(this.op, this.left, this.right);
}

// 调用时更简洁
void main() {
  final expr = Expr.app(
    Op.add,
    Expr.value(2),
    Expr.app(Op.mul, Expr.value(3), Expr.value(4)),
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 23:02:40