The Rust documentation gives this example where we have an instance of Result<T, E>
named some_value
:
match some_value {
Ok(value) => println!("got a value: {}", value),
Err(_) => println!("an error occurred"),
}
Is there any way to read from some_value
without pattern matching? What about without even checking the type of the contents at runtime? Perhaps we somehow know with absolute certainty what type is contained or perhaps we're just being a bad programmer. In either case, I'm just curious to know if it's at all possible, not if it's a good idea.
It strikes me as a really interesting language feature that this branch is so difficult (or impossible?) to avoid.
At the lowest level, no, you can't read enum fields without a
match
1.Methods on an enum can provide more convenient access to data within the enum (e.g.
Result::unwrap
), but under the hood, they're always implemented with amatch
.If you know that a particular case in a
match
is unreachable, a common practice is to writeunreachable!()
on that branch (unreachable!()
simply expands to apanic!()
with a specific message).1 If you have an enum with only one variant, you could also write a simple
let
statement to deconstruct the enum. Patterns inlet
andmatch
statements must be exhaustive, and pattern matching the single variant from an enum is exhaustive. But enums with only one variant are pretty much never used; a struct would do the job just fine. And if you intend to add variants later, you're better off writing amatch
right away.On the other hand, if you have an enum with more than one variant, you can also use
if let
andwhile let
if you're interested in the data from a single variant only. Whilelet
andmatch
require exhaustive patterns,if let
andwhile let
accept non-exhaustive patterns. You'll often see them used withOption
: