如何用Dart构建枚举?

Set*_*add 44 dart

Dart语言没有枚举(但??).构建枚举的正确或惯用方法是什么,至少在语言特征到来之前?

Set*_*add 56

Dart现在支持枚举.

这个答案的其余部分是Dart <= 1.8.如果使用> 1.8,请使用Dart对枚举的正式支持(在另一个答案中解释).

这是真的,Dart语言(但是?)没有枚举.有一个未解决的问题.

与此同时,这是一个惯用的Dart片段,用于创建自己的枚举.

class Enum {
  final _value;
  const Enum._internal(this._value);
  toString() => 'Enum.$_value';

  static const FOO = const Enum._internal('FOO');
  static const BAR = const Enum._internal('BAR');
  static const BAZ = const Enum._internal('BAZ');
}
Run Code Online (Sandbox Code Playgroud)

使用const构造函数意味着您可以在交换机中使用此枚举.这是一个例子:

class Fruits {
  final _value;
  const Fruits._internal(this._value);
  toString() => 'Enum.$_value';

  static const APPLE = const Fruits._internal('APPLE');
  static const PEAR = const Fruits._internal('PEAR');
  static const BANANA = const Fruits._internal('BANANA');
}

void main() {
  var yummy = Fruits.BANANA;

  switch (yummy) {
    case Fruits.APPLE:
      print('an apple a day');
      break;
    case Fruits.PEAR:
      print('genus Pyrus in the family Rosaceae');
      break;
    case Fruits.BANANA:
      print('open from the bottom, it is easier');
      break;
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 小警告:创建没有任何值的const对象是一个常见错误.例如"class Enum {const Enum();}".这不起作用,因为Dart规范化常量对象.因此,请始终确保具有区分各个枚举值的值. (7认同)
  • @AnthonyBobenrieth是的。但是,如果为_value添加吸气剂,则可以执行yummy.value =='BANANA'。 (2认同)

Gün*_*uer 15

有了r41815,Dart得到了原生的Enum支持,请参阅http://dartbug.com/21416并可以像

enum Status {
  none,
  running,
  stopped,
  paused
}

void main() {
  print(Status.values);
  Status.values.forEach((v) => print('value: $v, index: ${v.index}'));
  print('running: ${Status.running}, ${Status.running.index}');
  print('running index: ${Status.values[1]}');
}
Run Code Online (Sandbox Code Playgroud)

[Status.none,Status.running,Status.stopped,Status.paused]
value:Status.none,index:0
value:Status.running,index:1
value:Status.stopped,index:2
value:Status.paused, index:3
运行:Status.running,1
运行索引:Status.running

限制是不可能为枚举项设置自定义值,它们会自动编号.

本草案中的更多细节https://www.dartlang.org/docs/spec/EnumsTC52draft.pdf


小智 11

我在Dart Web Toolkit中使用了一个更简单的Enum类版本:

/**
 * Emulation of Java Enum class.
 *
 * Example:
 *
 * class Meter<int> extends Enum<int> {
 *
 *  const Meter(int val) : super (val);
 *
 *  static const Meter HIGH = const Meter(100);
 *  static const Meter MIDDLE = const Meter(50);
 *  static const Meter LOW = const Meter(10);
 * }
 *
 * and usage:
 *
 * assert (Meter.HIGH, 100);
 * assert (Meter.HIGH is Meter);
 */
abstract class Enum<T> {

  final T _value;

  const Enum(this._value);

  T get value => _value;
}
Run Code Online (Sandbox Code Playgroud)


Gre*_*owe 5

我喜欢枚举的顶级常量。您可以使用导入来修复任何冲突。这使得使用枚举不那么冗长。

IE

if (m == high) {}
Run Code Online (Sandbox Code Playgroud)

代替:

if (m == Meter.high) {}
Run Code Online (Sandbox Code Playgroud)

枚举定义:

class Meter<int> extends Enum<int> {
   const Meter(int val) : super (val);
}

const Meter high = const Meter(100);
const Meter middle = const Meter(50);
const Meter low = const Meter(10);
Run Code Online (Sandbox Code Playgroud)