2017-01-14 3 views
2

Для простого перечисления с несколькими непечатаемыми значениями может потребоваться, чтобы размер этого перечисления использовал меньший интегральный тип, чем значение по умолчанию. Например, это обеспечивает возможность хранения перечисления в массиве u8.Как указать базовый тип перечисления в Rust?

enum MyEnum { 
    A = 0, 
    B, 
    C, 
} 

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

Как это можно указать, так что его size_of соответствует искомому целочисленному типу?

+0

Обратите внимание, что есть некоторые аналогичные вопросы, но они спрашивают о взаимодействии с другими языками * (что делает мои первоначальные попытки найти эту информацию!) * - так задал новый вопрос. – ideasman42

+0

Хотя это отмечено как дубликат, другой вопрос касается C++ FFI. – ideasman42

ответ

5

Это можно сделать, используя спецификатор representation (repr).

#[repr(u8)] 
enum MyEnum { A = 0, B, C, } 

Назначенные значения вне диапазона значений повысят предупреждение компилятора.

0

Что вы подразумеваете под «Мы можем захотеть them»?

A, B и C в вашей программе, определяемые пользователем конструкторы значений, а не field, как известно, в ООП. Вместо этого вы можете указать тип для параметров, как показано ниже.

enum Message { 
    Quit, 
    ChangeColor(i32, i32, i32), 
    Move { x: i32, y: i32 }, 
    Write(String), 
} 

Отрывок из https://doc.rust-lang.org/book/enums.html.

+0

Обратите внимание, что Rust 'enum' НЕ должен использоваться как дискриминированный союз (aka tagged union) и может использоваться как« простые »перечисления для перечисления ряда связанных интегральных значений. Это конкретный пример использования, представленный OP здесь. –

+0

@ MatthieuM. Являются ли эти значения (например, 0 для A) изменчивыми в C-подобных случаях использования? – hpwsue

+0

'MyEnum :: A' сам по себе является константой, однако значение' MyEnum' может быть изменено. Это действительно просто частный случай «enum», где ни один из вариантов не имеет полезной нагрузки, и в этом случае значение дискриминанта может быть (1) указано и (2) запрошено. –