Rust书calls the ref
keyword "legacy"。因为我想遵循隐含的建议以避免ref
,我怎么能在以下玩具示例中做到这一点?您也可以在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,
// }
}
}
由于self
是&mut Self
类型,它足以匹配自己,而完全省略ref
。用*self
取消引用它或将&
添加到匹配臂会导致不必要的移动。
fn ref_mut(&mut self) -> &mut i32 {
match self {
OwnBox(i) => i,
}
}
然而,对于像这样的新类型,&mut self.0
就足够了。