Sub-bindings, e.g. ref x @ Some(ref y)
are now allowed under
#![feature(bindings_after_at)]
and checked to make sure that
memory safety is upheld.
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 => {},
}
RunAfter:
match Some("hi".to_string()) {
Some(ref s) => {
let op_string_ref = &Some(s);
// ...
},
None => {},
}
RunThe op_string_ref
binding has type &Option<&String>
in both cases.
See also Issue 14587.