如何在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
相关产品推荐
相关产品推荐

