In certain cases it is possible for sub-bindings to violate memory safety. Updates to the borrow checker in a future version of Rust may remove this restriction, but for now patterns must be rewritten without sub-bindings.
Before:
match Some("hi".to_string()) { ref op_string_ref @ Some(s) => {}, None => {}, }
After:
match Some("hi".to_string()) { Some(ref s) => { let op_string_ref = &Some(s); // ... }, None => {}, }
The op_string_ref
binding has type &Option<&String>
in both cases.