Подтвердить что ты не робот

Как я могу создать перечисление с помощью Dart?

Язык дарства не имеет перечислений (пока?). Каков правильный или идиоматический способ создания перечисления, по крайней мере, до тех пор, пока не появится языковая функция?

4b9b3361

Ответ 1

С 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]}');
}

[Status.none, Status.running, Status.stopped, Status.pauseed]
value: Status.none, index: 0
value: Status.running, index: 1
значение: Status.stopped, index: 2
value: Status.pause, index: 3
running: Status.running, 1
индекс выполнения: Status.running

Ограничение состоит в том, что не возможно устанавливать пользовательские значения для элемента перечисления, они автоматически нумеруются.

Подробнее в этом проекте https://www.dartlang.org/docs/spec/EnumsTC52draft.pdf

Ответ 2

Теперь у Дарта есть поддержка перечислений.

Остальная часть этого ответа для Dart <= 1.8. Если вы используете > 1.8, используйте формальную поддержку 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');
}

Использование конструкторов 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;
  }
}

Ответ 3

Я использую немного более простую версию класса Enum в Dart Web Toolkit:

/**
 * 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;
}

Ответ 4

Мне нравятся константы верхнего уровня для моих перечислений. Вы можете использовать импорт для устранения любых столкновений. Это делает использование перечислений намного менее подробным.

то есть.

if (m == high) {}

вместо:

if (m == Meter.high) {}

Определение enum:

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);