Как я могу получить от Kotlin enum такое же поведение, что и у cpp

#enums #kotlin

#перечисления #kotlin

Вопрос:

Я хотел бы получить такое же поведение, как у cpp:

 enum dxgi_format_gli
{
    DXGI_FORMAT_R64_UINT_GLI = 1,
    DXGI_FORMAT_R64_SINT_GLI
}
  

где DXGI_FORMAT_R64_UINT_GLI получает 1, а следующий получает 2

самое близкое, что у меня есть:

 private var counter: Int = 2;

enum class dxgi_format_gli(i: Int = counter  ) {

    DXGI_FORMAT_R64_UINT_GLI(1),
    DXGI_FORMAT_R64_SINT_GLI()
}
  

Однако я бы хотел, чтобы оно, конечно, было динамическим, то есть всякий раз, когда я вызываю конструктор с параметром, сохраняю его, counter и все следующие конструкторы увеличивают и получают его..

Я уже сделал это на java:

 public enum Dxgi_format_gli {

    DXGI_FORMAT_R64_UINT_GLI(1),
    DXGI_FORMAT_R64_SINT_GLI;

    public final int value;

    private static class Counter {

        private static short value = 0;
    }

    private Dxgi_format_gli() {
        value = Counter.value;
        Counter.value  ;
    }

    private Dxgi_format_gli(int value) {
        this.value = value;
        Counter.value  ;
    }
}
  

Но я не делал этого с помощью Kotlin..

Ответ №1:

У каждого enum уже есть автоматически сгенерированное свойство ordinal :

 enum class A {a, b, c}

A.a.ordinal  // 0
A.b.ordinal  // 1
A.c.ordinal  // 2
  

Итак, технически самый простой способ получить то, что вы хотите dxgi_format_gli.DXGI_FORMAT_R64_UINT_GLI.ordinal 1 (я понятия не имею, почему вы не хотите начинать с 0 0_o)

Вы можете заменить код в ответе @griffio на это:

 enum class Dxgi_format_gli {

  DXGI_FORMAT_R64_UINT_GLI,
  DXGI_FORMAT_R64_SINT_GLI;

  val value = ordinal   1
}
  

Комментарии:

1. Спасибо за ваш ответ, однако я не начинаю с 0 того, что это cpp-код, который я переношу (кстати, есть объяснение)

2. Классное предложение val value = ordinal 1 voddan, 1:p

Ответ №2:

Я думаю, вам просто нужно установить значение и переместить приращение, чтобы оно работало — чтобы начальный счетчик и значение были одинаковыми.

 enum class Dxgi_format_gli {

  DXGI_FORMAT_R64_UINT_GLI(1),
  DXGI_FORMAT_R64_SINT_GLI;

  val value: Int

  private object Counter {
    var value: Int = 0
  }

  constructor() {
    Counter.value  
    value = Counter.value.toInt()
  }

  private constructor(value: Int) {
    this.value = value
    Counter.value = value
  }
}
  

Комментарии:

1. Очень круто! Вы эмулировали лучшую функцию C ! Смотрите мой ответ для короткого пути.