在采用 &self 或 &mut self 的函数中进行模式匹配时,如何避免 ref 关键字? [英] How can the ref keyword be avoided when pattern matching in a function taking &self or &mut self?

查看:39
本文介绍了在采用 &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 — 匹配人体工程学.

这篇关于在采用 &self 或 &mut self 的函数中进行模式匹配时,如何避免 ref 关键字?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆