当前位置:首页 > 科技  > 软件

Rust: 如何区分可变引用还是可变变量?&mut VS mut

来源: 责编: 时间:2024-04-26 08:50:39 231观看
导读变量要在Rust中创建不可变变量,只需编写let x = 1337,这是简单的。如果想创建一个以后可以改变的变量,只需在let之后添加mut关键字。添加mut关键字通知其他人该变量将在代码的其他地方被修改。例如:let mut x = 1337 和 l

变量

要在Rust中创建不可变变量,只需编写let x = 1337,这是简单的。如果想创建一个以后可以改变的变量,只需在let之后添加mut关键字。添加mut关键字通知其他人该变量将在代码的其他地方被修改。INS28资讯网——每日最新资讯28at.com

例如:let mut x = 1337 和 let y = 42,如图:INS28资讯网——每日最新资讯28at.com

图片图片INS28资讯网——每日最新资讯28at.com

INS28资讯网——每日最新资讯28at.com

INS28资讯网——每日最新资讯28at.com

INS28资讯网——每日最新资讯28at.com

INS28资讯网——每日最新资讯28at.com

引用

目前,一切都很简单。然而,当使用mut引用时,事情开始变得有点棘手。让我们创建一些。INS28资讯网——每日最新资讯28at.com

let mut x = 1337;let y = 42;let x_ref = &mut x;let y_ref = &y;

INS28资讯网——每日最新资讯28at.com

我们创建了两个引用,其中一个是可变引用,另一个是只读引用。INS28资讯网——每日最新资讯28at.com

图片图片INS28资讯网——每日最新资讯28at.com

在给定的4个变量中,其中2个是引用,这两个引用变量都是不可变的,在let之后没有mut关键字,这意味着我不能更改它们指向的内容。但是,我仍然可以更改它们引用的值。INS28资讯网——每日最新资讯28at.com

*x_ref = 777;

如果你这样写,Rust编译器不会报错,x的值(不是ref本身)会变成777。那么,为什么我可以改变它所指向的值呢?INS28资讯网——每日最新资讯28at.com

INS28资讯网——每日最新资讯28at.com

在没有任何隐式类型推导的形式下,x_ref的变量应该是这样:INS28资讯网——每日最新资讯28at.com

let x_ref: &mut i32 = &mut x;

INS28资讯网——每日最新资讯28at.com

INS28资讯网——每日最新资讯28at.com

可以将其解释为:创建一个名为x_ref的不可变变量,它将保存对i32的可变引用,并立即将其初始化为x变量中对i32值的可变引用。INS28资讯网——每日最新资讯28at.com

INS28资讯网——每日最新资讯28at.com

这意味着我们可以修改它指向的值,但不能改变引用本身的值(或地址)。换句话说,我不能这样写:INS28资讯网——每日最新资讯28at.com

let x_ref: &mut i32 = &mut x;let mut z = 0;x_ref = &mut z; // Not allowed!

图片图片INS28资讯网——每日最新资讯28at.com

INS28资讯网——每日最新资讯28at.com

INS28资讯网——每日最新资讯28at.com

让我们修改代码:INS28资讯网——每日最新资讯28at.com

let mut x: i32 = 1337;let mut x_ref: &mut i32 = &mut x; // 在x_ref前面加了mutlet mut z = 0;x_ref = &mut z; // Allowed!

INS28资讯网——每日最新资讯28at.com

x_ref周围有太多的mut,让我们来描述一下:INS28资讯网——每日最新资讯28at.com

INS28资讯网——每日最新资讯28at.com

1,let mut x_ref:我们正在创建一个名为x_ref的可变变量,这意味着可以稍后更改它的值。INS28资讯网——每日最新资讯28at.com

INS28资讯网——每日最新资讯28at.com

2,&mut i32:声明该变量为i32类型的可变引用INS28资讯网——每日最新资讯28at.com

INS28资讯网——每日最新资讯28at.com

3,&mut x:x变量的可变借用INS28资讯网——每日最新资讯28at.com

INS28资讯网——每日最新资讯28at.com

然后,创建了一个名为z的变量,并将其赋值为0。之后,当写x_ref = &mut z时,x_ref是一个可变变量,保存对i32值的可变引用。INS28资讯网——每日最新资讯28at.com

INS28资讯网——每日最新资讯28at.com

图片图片INS28资讯网——每日最新资讯28at.com

INS28资讯网——每日最新资讯28at.com

让我们看一下语句:INS28资讯网——每日最新资讯28at.com

let mut x_ref = &mut x;

INS28资讯网——每日最新资讯28at.com

以等号分割成两个子语句:左边提供关于变量本身的信息,而右边告诉我们关于变量的值。INS28资讯网——每日最新资讯28at.com

INS28资讯网——每日最新资讯28at.com

当使用“ * ”解引用操作符来改变值时INS28资讯网——每日最新资讯28at.com

*x_ref = 100;

INS28资讯网——每日最新资讯28at.com

没有改变x_ref变量的值。相反,改变了x_ref引用的值。INS28资讯网——每日最新资讯28at.com

INS28资讯网——每日最新资讯28at.com

INS28资讯网——每日最新资讯28at.com

不可变引用INS28资讯网——每日最新资讯28at.com

INS28资讯网——每日最新资讯28at.com

let i = 1;let j = 2;let mut k = &i;

INS28资讯网——每日最新资讯28at.com

能改变这里i的值吗?我们可以改变k的值(在左边看到mut),但是这个值(右边)是对i的不可变引用(这里没有mut)。INS28资讯网——每日最新资讯28at.com

INS28资讯网——每日最新资讯28at.com

因此:INS28资讯网——每日最新资讯28at.com

let i = 1;let j = 2;let mut k = &i;k = &j; // 这是允许的*k = 3; // 这是不允许的

INS28资讯网——每日最新资讯28at.com

图片图片INS28资讯网——每日最新资讯28at.com

INS28资讯网——每日最新资讯28at.com

INS28资讯网——每日最新资讯28at.com

总结

INS28资讯网——每日最新资讯28at.com

在本文中,我们剖析了mut关键字和引用之间的细微差别。记住,可变引用和持有引用的可变变量是有区别的。INS28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-85701-0.htmlRust: 如何区分可变引用还是可变变量?&mut VS mut

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Zustand:让React状态管理更简单、更高效

下一篇: Java的栈帧和动态链接是什么?

标签:
  • 热门焦点
  • 一篇聊聊Go错误封装机制

    %w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。使
  • 共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大“烤”之下的除了众生,还有各大企业发布的ESG报告。ESG是“环境保
  • 三星Galaxy Z Fold5官方渲染图曝光:13.4mm折叠厚度依旧感人

    据官方此前宣布,三星将于7月26日在韩国首尔举办Unpacked活动,届时将带来带来包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy Z Flip 5、
  • iQOO 11S或7月上市:搭载“鸡血版”骁龙8Gen2 史上最强5G Soc

    去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,iQOO 11不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞屏,同时在快充
  • 到手价3099元起!iQOO Neo8 Pro今日首销:安卓性能最强旗舰

    5月23日,iQOO如期举行了新品发布会,全新的iQOO Neo8系列也正式与大家见面,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更
  • 苹果MacBook Pro 2021测试:仍不支持平滑滚动

    据10月30日9to5 Mac 消息报道,苹果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后获得了不错的评价,亮点包括行业领先的性能,令人印象深刻的电池续航,精美丰
Top