rust/src/doc/trpl/enums.md
Steve Klabnik 213708867e TRPL editing: enums
Now that we're not doing the guessing game, a lot of this is irrelevant.
2015-04-20 09:37:45 -04:00

2.2 KiB
Raw Blame History

% Enums

Rust has a sum type, an enum. Enums are an incredibly useful feature of Rust, and are used throughout the standard library. An enum is a type which relates a set of alternates to a specific name. For example, below we define Character to be either a Digit or something else.

enum Character {
    Digit(i32),
    Other,
}

Most types are allowed as the variant components of an enum. Here are some examples:

struct Empty;
struct Color(i32, i32, i32);
struct Length(i32);
struct Stats { Health: i32, Mana: i32, Attack: i32, Defense: i32 }
struct HeightDatabase(Vec<i32>);

You see that, depending on its type, an enum variant may or may not hold data. In Character, for instance, Digit gives a meaningful name for an i32 value, where Other is only a name. However, the fact that they represent distinct categories of Character is a very useful property.

The variants of an enum by default are not comparable with equality operators (==, !=), have no ordering (<, >=, etc.), and do not support other binary operations such as * and +. As such, the following code is invalid for the example Character type:

// These assignments both succeed
let ten  = Character::Digit(10);
let four = Character::Digit(4);

// Error: `*` is not implemented for type `Character`
let forty = ten * four;

// Error: `<=` is not implemented for type `Character`
let four_is_smaller = four <= ten;

// Error: `==` is not implemented for type `Character`
let four_equals_ten = four == ten;

We use the :: syntax to use the name of each variant: Theyre scoped by the name of the enum itself. This allows both of these to work:

Character::Digit(10);
Hand::Digit;

Both variants are named Digit, but since theyre scoped to the enum name,

Not supporting these operations may seem rather limiting, but its a limitation which we can overcome. There are two ways: by implementing equality ourselves, or by pattern matching variants with match expressions, which youll learn in the next section. We dont know enough about Rust to implement equality yet, but well find out in the traits section.