Enum Projections
To desugar enum patterns we need a way to talk about the places inside of an enum variant.
If $place is of an enum type, this features adds a $place.$variant_name place expression that
refers to the contents of the $variant_name variant.
That place then has one field for each field of the variant.
For example:
#![allow(unused)]
fn main() {
let opt: &mut Option<u32> = ...;
if let Some(ref mut x) = *opt {
// x: &mut u32 here
}
// desugars to:
if let Some(_) = *opt {
let x = unsafe { &mut (*opt).Some.0 };
}
}
Using this place is UB if the enum value didn’t have the correct discriminant, and thus this operation
requires an unsafe block.
The place $place.$variant_name can’t be used by itself because we don’t have a type for it; it
must be directly followed by a field projection.
Backlinks