在采用 &self 或 &mut self 的函数中进行模式匹配时,如何避免 ref 关键字?
问题描述:
Rust 书 调用ref
关键字legacy".由于我想遵循隐含的建议来避免 ref
,我该如何在下面的玩具示例中做到这一点?您也可以在 playground 上找到代码.
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,
// }
}
}
答
由于 self
是 &mut Self
类型,所以匹配自身就足够了,而完全省略 ref
.使用 *self
取消引用它或将 &
添加到匹配臂都会导致不必要的移动.
Since self
is of type &mut Self
, it is enough to match against itself, while omitting ref
entirely. Either dereferencing it with *self
or adding &
to the match arm would cause an unwanted move.
fn ref_mut(&mut self) -> &mut i32 {
match self {
OwnBox(i) => i,
}
}
对于像这样的新类型,&mut self.0
就足够了.
For newtypes such as this one however, &mut self.0
would have been enough.
这要归功于 RFC 2005 — 匹配人体工程学.