Surprising how much computer stuff makes sense viewed as tragic deprivation of sum types (cf. deprivation of lambdas)
The first topic of this chapter is potent, as old as the hills, happy to help you get a lot done in short order (for a price), and known by many names in many cultures. But it’s not the devil. It’s a kind of user-defined data type, long known to ML and Haskell hackers as sum types, discriminated unions, or algebraic data types. In Rust, they are called enumerations, or simply enums. Unlike the devil, they are quite safe, and the price they ask is no great privation.
C++ and C# have enums; you can use them to define your own type whose values are a set of named constants. For example, you might define a type named
Color with values
Yellow, and so on. This kind of enum works in Rust, too. But Rust takes enums much further. A Rust enum can also contain data, even data of varying types. For example, Rust’s
Result<String, io::Error> type is an enum; such a value is either an
Ok value containing a
String, or an
Err value containing an
io::Error. This is beyond what C++ and C# enums can do. It’s more like a C
union—but unlike unions, Rust enums are type-safe.
Enums are useful whenever a value might be either one thing or another. The “price” of using them is that you must access the data safely, using pattern matching, our topic for the second half of this chapter.
Patterns, too, may be familiar if you’ve used ...