4161|14

5225

帖子

239

TA的资源

管理员

《Rust实战》书友互动第四集:生命周期、所有权和借用 [复制链接]

 

五一归来,我们继续,本集是Rust语言特色的最后一章节啦,小伙伴们我们继续。

 

 

演绎时间:即日起至5月12日
脚本限定:《Rust实战》第四章 生命周期、所有权和借用
 
角色分配:
提问角色(4位)和解题角色(4位)、总结角色(2位),下方跟帖第一位书友嘉宾是提问角色,第二个是解题角色,解答第一个提问,解答完后,解题角色可以继续提问,也可以不提问,结束一次问答循环。后面参与继续新起问答接龙即可,最后2位是章节总结角色,以文字或者思维导图的形式,对本章进行总结,至此一次互动结束。注意:提问角色发布的问题,要求能在第四章节书中有迹可循,且对解题者理解、学习Rust有切实意义;提问角色所发布的问题不可重复。
 

活动交流群

论坛有开设嵌入式交流群,欢迎感兴趣的小伙伴,微信添加“helloeeworld”为好友,对话:加入嵌入式交流群,入群交流。

扫码,对话:加入嵌入式交流群。

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

最新回复

总结: Rust中的生命周期、所有权和借用是该语言的核心概念,它们共同构成了Rust的内存管理系统。 生命周期:生命周期是Rust中用来描述引用有效范围的概念。它们确保引用在其所引用的数据有效的情况下才能被使用。生命周期通过引用的作用域来确定,可以在函数签名中使用生命周期参数来指定引用的有效范围。 所有权:所有权规定了在Rust中如何管理内存。每个值都有一个所有者,只能有一个所有者。当所有者超出作用域时,值将被销毁。这种机制避免了内存泄漏和悬垂指针的问题。 借用:借用允许代码临时获取对值的引用,而不获取其所有权。借用分为不可变借用和可变借用两种,它们遵循借用规则,确保在同一时间内不会出现多个可变引用或者同时出现可变引用和不可变引用。 这些概念共同确保了Rust在内存安全和并发安全方面具有很高的保障,使得开发者能够编写高效且安全的代码。   详情 回复 发表于 2024-5-12 09:47

回复
举报

6842

帖子

11

TA的资源

版主

本帖最后由 lugl4313820 于 2024-5-6 17:29 编辑

Rust的所有权系统是非常出色的。但是用得不好,就会让你遇到不少的麻烦。文中提到有哪4个解决所有权的策略。

点评

1、在不需要完整所有权的地方使用引用; 2、重构代码,减少长存活期的值; 3、在需要完整所有权的地方复制长存活期的值; 4、把数据包装到能帮助解决移动问题的类型中;  详情 回复 发表于 2024-5-6 21:53

回复

2056

帖子

0

TA的资源

五彩晶圆(初级)

lugl4313820 发表于 2024-5-6 17:28 Rust的所有权系统是非常出色的。但是用得不好,就会让你遇到不少的麻烦。文中提到有哪4个解决所有权的策略 ...

1、在不需要完整所有权的地方使用引用;

2、重构代码,减少长存活期的值;

3、在需要完整所有权的地方复制长存活期的值;

4、把数据包装到能帮助解决移动问题的类型中;

点评

这个总结值得回味。。。。。。 只能等细细看过之后再说了。。。。。  详情 回复 发表于 2024-5-7 15:33

回复

502

帖子

4

TA的资源

纯净的硅(高级)

克隆和复制的区别是什么?

(P124表4.2)

点评

哦?截图能否贴出来看看? 对clone的理解就是独立准备了一份 什么时候是复制?赋值是不是复制?这个细微差别动态语言比较明显  详情 回复 发表于 2024-5-7 15:31

回复

1195

帖子

1

TA的资源

五彩晶圆(初级)

qinyunti 发表于 2024-5-6 22:41 克隆和复制的区别是什么? (P124表4.2)

哦?截图能否贴出来看看?

对clone的理解就是独立准备了一份

什么时候是复制?赋值是不是复制?这个细微差别动态语言比较明显


回复

1195

帖子

1

TA的资源

五彩晶圆(初级)

IC爬虫 发表于 2024-5-6 21:53 1、在不需要完整所有权的地方使用引用; 2、重构代码,减少长存活期的值; 3、在需要完整所有权的 ...

这个总结值得回味。。。。。。

只能等细细看过之后再说了。。。。。


回复

4792

帖子

12

TA的资源

版主

本帖最后由 吾妻思萌 于 2024-5-8 21:31 编辑

克隆是显式的,是新开辟空间全部照搬,是可以自主定义的。

复制时隐式的,是一个很方便在栈上复制一份出来的,一般就是每个bit都复制一份。


回复

4792

帖子

12

TA的资源

版主

提问:不禁想问常量到底该不该存在啊?比如计算器的pi -> 3.1415926...到底是随用随设置,然后释放了好,还是一直保留着一直占着空间好呢?

点评

常量这东西吧,它还真挺重要的。就像咱们算圆周率π,每次要用到的时候都去设置一遍3.1415926...,那多麻烦啊,还容易输错。还不如一开始就定义个常量,名叫PI,编译器聪明着呢,会直接把它当作一个固定的数值嵌到  详情 回复 发表于 2024-5-9 11:07

回复

45

帖子

1

TA的资源

一粒金砂(中级)

吾妻思萌 发表于 2024-5-8 21:31 提问:不禁想问常量到底该不该存在啊?比如计算器的pi -> 3.1415926...到底是随用随设置,然后释放了好, ...

常量这东西吧,它还真挺重要的。就像咱们算圆周率π,每次要用到的时候都去设置一遍3.1415926...,那多麻烦啊,还容易输错。还不如一开始就定义个常量,名叫PI,编译器聪明着呢,会直接把它当作一个固定的数值嵌到代码里头(以立即数方式存在二进制文件中),既不怎么占空间,用起来还特快。这样一来,代码看着清爽多了,以后维护也省心。当然,不可变变量(随用随设置)也有它大显身手的时候。想象一下,如果你正在编写一个程序,需要初始化一些数据结构或者配置信息,这些信息在程序运行期间不会改变,但是它们的值可能是在程序启动时通过读取文件、数据库或者用户输入动态确定的,这时候使用不可变变量(let)就更合适了(他通常保存在栈上)。


回复

60

帖子

0

TA的资源

一粒金砂(中级)

所有权在Rust 语言中非常重要,用于管理程序中使用的资源。这些资源可以是堆上的动态分配的内存资源,也可以是栈上的内存资源,或者是其他的系统资源,比如 IO 资源。


回复

60

帖子

0

TA的资源

一粒金砂(中级)

一个由固定尺寸类型组成的结构体变量,在赋值给另一个变量时,采用的是移动方式还是复制方式?

点评

执行以下代码: struct  Cxxx{     id:u64 } fn main() {     println!("Hello, world!");     let _c0 =  &mut  C  详情 回复 发表于 2024-5-11 19:14

回复

183

帖子

12

TA的资源

一粒金砂(高级)

ltaodream 发表于 2024-5-11 02:06 一个由固定尺寸类型组成的结构体变量,在赋值给另一个变量时,采用的是移动方式还是复制方式?

执行以下代码:

struct  Cxxx{
    id:u64
}

fn main() {
    println!("Hello, world!");
    let _c0 =  &mut  Cxxx{id:0};
    let c1 = _c0  ;
    _c0.id =1;
}

会提示以下信息:

error[E0382]: use of moved value: `_c0`
 --> src/main.rs:9:5
  |
7 |     let _c0 =  &mut  Cxxx{id:0};
  |         --- move occurs because `_c0` has type `&mut Cxxx`, which does not implement the `Copy` trait
8 |     let c1 = _c0  ;
  |              --- value moved here
9 |     _c0.id =1;
  |     ^^^^^^^^^ value used here after move

所以答案是 move 。

但我有个疑问,为什么用 &mut 修饰了 Cxxx,就没有  `Copy` trait 了?

点评

在Rust中,&mut修饰的引用表示可变引用,它允许对数据进行修改。当使用&mut修饰一个类型时,这个类型必须实现Copy trait。因为Copy trait要求类型在赋值时进行复制而不是移动,而可变引用的存在可能导致数据被修  详情 回复 发表于 2024-5-12 09:42

回复

2889

帖子

4

TA的资源

五彩晶圆(中级)

如何理解“借用”参考第四章的内容,rust中的一个让人迷惑的问题是,rust基本类型默认是在所有权变化时,提供自动的copy trait特性,这就造成了假象:有时候没事,时好时坏。只要把这个特性搞明白了,所有的变脸都一样。


回复

288

帖子

0

TA的资源

一粒金砂(高级)

nemon 发表于 2024-5-11 19:14 执行以下代码: struct  Cxxx{     id:u64 } fn main ...

在Rust中,&mut修饰的引用表示可变引用,它允许对数据进行修改。当使用&mut修饰一个类型时,这个类型必须实现Copy trait。因为Copy trait要求类型在赋值时进行复制而不是移动,而可变引用的存在可能导致数据被修改,因此Rust不允许可变引用的类型实现Copy trait。这是为了避免在使用可变引用时出现潜在的数据竞争和不安全的情况。


回复

288

帖子

0

TA的资源

一粒金砂(高级)

总结:

Rust中的生命周期、所有权和借用是该语言的核心概念,它们共同构成了Rust的内存管理系统。

  1. 生命周期:生命周期是Rust中用来描述引用有效范围的概念。它们确保引用在其所引用的数据有效的情况下才能被使用。生命周期通过引用的作用域来确定,可以在函数签名中使用生命周期参数来指定引用的有效范围。

  2. 所有权:所有权规定了在Rust中如何管理内存。每个值都有一个所有者,只能有一个所有者。当所有者超出作用域时,值将被销毁。这种机制避免了内存泄漏和悬垂指针的问题。

  3. 借用:借用允许代码临时获取对值的引用,而不获取其所有权。借用分为不可变借用和可变借用两种,它们遵循借用规则,确保在同一时间内不会出现多个可变引用或者同时出现可变引用和不可变引用。

这些概念共同确保了Rust在内存安全和并发安全方面具有很高的保障,使得开发者能够编写高效且安全的代码。


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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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