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

标签 rust pattern-matching

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 就足够了。

这要归功于 RFC 2005 — Match Ergonomics .

关于rust - 在采用 &self 或 &mut self 的函数中进行模式匹配时,如何避免 ref 关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55362584/

相关文章:

macros - 如何在 Rust 程序宏中创建多个项目?

rust - std::process::Command 没有输出

Scala:通过 Reflect.runtime.universe.Type 进行模式匹配?

F# 列表模式匹配限制还是只是写得不好?

.net - F# 如何捕获所有异常

c - 字符串匹配了多少次

log4j - 通过匹配模式过滤日志-log4j

closures - 盒装 Fn 仅在测试时才需要 lifetime 'static?

rust - 如何在循环中从可变字符串中删除字符?

rust - 检查 Rust 中值的连续性