Как работают перечисления?

Я только начинаю с Solidityи JavaScriptпытаюсь понять Enums. у меня простой договор

pragma solidity ^0.4.4;

contract SimpleEnum {
  enum SomeData {Channel}
  SomeData sd;

  function set_values(uint a) {
    sd.Channel = a
    return sd
  }
}

Я пытаюсь понять, как я могу установить Channel, но, похоже, это не работает.

Ответы (2)

У вас есть некоторые ошибки, поэтому подумайте о том, чтобы прочитать документацию по Solidity . Кроме того, ремикс — это удобный инструмент для кодирования, отладки и упражнений по кодированию. Я изменил ваш код следующим образом:

pragma solidity ^0.5.0;

contract SimpleEnum {

  enum SomeData {DEFAULT,ONE,TWO}
  SomeData someData;

  constructor() public {
      someData = SomeData.DEFAULT;
  }

  function setValues(uint _value) public {
      require(uint(SomeData.TWO) >= _value);
      someData = SomeData(_value);
  }

  function getValue() public view returns (uint){
      return uint(someData);
  }
}

Надеюсь поможет~

Обновить

О Enums , описанном ниже:

перечисления — это один из способов создания пользовательского типа в Solidity. Они могут быть явно преобразованы во все целочисленные типы и из них, но неявное преобразование не допускается. Явные преобразования проверяют диапазоны значений во время выполнения, и сбой вызывает исключение. Enums требуется по крайней мере один член.

Значения перечисления нумеруются в порядке их определения, начиная с 0. Если вы хотите получить значение перечисления, выполните uint(enum_variable).

спасибо - я понял, что даже не использую правильный тип для своей проблемы. если я изменю этот вопрос, чтобы он касался перечислений (в чем вы мне помогли), а не тестирования, можете ли вы внести какие-либо изменения, необходимые, чтобы привести его в большее соответствие с новым вопросом? тогда я выберу это как ответ.
Да, конечно~
Потрясающие! Спасибо. Как я уже сказал, я только начинаю. Не возражаете ли вы изменить имя переменной на SomeData, как это сделал я? Это общее, и я думаю, что таким образом это будет менее запутанным для другого новичка.
изменил переменную~

Обратитесь к документации enum ,

pragma solidity ^0.4.16;

contract test {
enum ActionChoices { GoLeft, GoRight, GoStraight, SitStill }
ActionChoices choice;
ActionChoices constant defaultChoice = ActionChoices.GoStraight;

function setGoStraight() public {
    choice = ActionChoices.GoStraight;
}

// Since enum types are not part of the ABI, the signature of "getChoice"
// will automatically be changed to "getChoice() returns (uint8)"
// for all matters external to Solidity. The integer type used is just
// large enough to hold all enum values, i.e. if you have more values,
// `uint16` will be used and so on.
function getChoice() public view returns (ActionChoices) {
    return choice;
}

function getDefaultChoice() public pure returns (uint) {
    return uint(defaultChoice);
}


}

Из этого официального примера видно, что функция getChoice()возвращает индекс этого действия. Итак, я предполагаю, что перечисление похоже на список в python, который преобразует значения внутри в соответствующий индекс.