The Rust book calls the ref
keyword "legacy". As I want to follow the implicit advice to avoid ref
, how can I do it in the following toy example? You can find the code also on the playground.
struct OwnBox(i32);
impl OwnBox {
fn ref_mut(&mut self) -> &mut i32 {
match *self {
OwnBox(ref mut i) => i,
}
// This doesn't work. -- Even not, if the signature of the signature of the function is
// adapted to take an explcit lifetime 'a and use it here like `&'a mut i`.
// match *self {
// OwnBox(mut i) => &mut i,
// }
// This doesn't work
// match self {
// &mut OwnBox(mut i) => &mut i,
// }
}
}
Since
self
is of type&mut Self
, it is enough to match against itself, while omittingref
entirely. Either dereferencing it with*self
or adding&
to the match arm would cause an unwanted move.For newtypes such as this one however,
&mut self.0
would have been enough.This is thanks to RFC 2005 — Match Ergonomics.