601|3

4942

帖子

12

TA的资源

版主

楼主
 

《Rust实战》循环也要谨记所有权 [复制链接]

基本数据类型和所有权本来就迷迷糊糊,现在在循环也要时刻谨记所有权。

无论什么情况,都要时刻谨记所有权 ----鲁迅。
for循环所有权
使用方法 等价使用的方法 所有权

for item in collection{

    //pass

}

for item in IntoIterator::into_iter(collection) {

    //pass

}

collection所有权给了for循环,后面不能使用了

for item in &collection{

    //pass

}

for item in collection.iter() {

    //pass

}

collection所有权给了for循环,collection后面依旧能够使用

for item in &mut collection{

    //pass

}

for item in collection.iter_mut() {

    //pass

}

collection可变借用,collection后面依旧能够使用(但是变了)

 

两种循环方式优劣对比

以下代码,使用了两种循环方式:

// 第一种 
let collection = [1, 2, 3, 4, 5]; 
for i in 0..collection.len() { 
		let item = collection[i];
 		// ... 
} 

// 第二种 
for item in collection { 

}

第一种方式是循环索引,然后通过索引下标去访问集合,第二种方式是直接循环集合中的元素,优劣如下:

  • 性能:第一种使用方式中 collection[index] 的索引访问,会因为边界检查(Bounds Checking)导致运行时的性能损耗 —— Rust 会检查并确认 index 是否落在集合内,但是第二种直接迭代的方式就不会触发这种检查,因为编译器会在编译时就完成分析并证明这种访问是合法的
  • 安全:第一种方式里对 collection 的索引访问是非连续的,存在一定可能性在两次访问之间,collection 发生了变化,导致脏数据产生。而第二种直接迭代的方式是连续访问,因此不存在这种风险( 由于所有权限制,在访问过程中,数据并不会发生变化)。

由于 for 循环无需任何条件限制,也不需要通过索引来访问,因此是最安全也是最常用的。

此帖出自编程基础论坛

最新回复

总结非常到位呀!   详情 回复 发表于 2024-5-3 12:06
点赞 关注
 

回复
举报

6107

帖子

4

TA的资源

版主

沙发
 

看楼主这么介绍,感觉像全城戒严啊。不放走一个!!!

此帖出自编程基础论坛
 
 
 

回复

6561

帖子

9

TA的资源

版主

板凳
 

for 循环无需任何条件限制,也不需要通过索引来访问,那么所有权一给不就相当于分类了吗?

此帖出自编程基础论坛
 
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 

回复

7056

帖子

11

TA的资源

版主

4
 

总结非常到位呀!

此帖出自编程基础论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表