在使用&self或&mut self的函数中进行模式匹配时,如何避免ref关键字?

问题描述 投票:1回答:1

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,
        // }
    }
}
rust pattern-matching
1个回答
5
投票

由于self&mut Self类型,它足以匹配自己,而完全省略ref。用*self取消引用它或将&添加到匹配臂会导致不必要的移动。

fn ref_mut(&mut self) -> &mut i32 {
    match self {
        OwnBox(i) => i,
    }
}

然而,对于像这样的新类型,&mut self.0就足够了。

这要归功于RFC 2005 — Match Ergonomics

© www.soinside.com 2019 - 2024. All rights reserved.