From d3aee1ea95e82bad1d2c1297147b76e3bd118884 Mon Sep 17 00:00:00 2001 From: Davirain Date: Wed, 17 May 2023 16:41:35 +0800 Subject: [PATCH] update summary --- src/SUMMARY.md | 13 +++++++++++++ {assets => src/assets}/1.png | Bin {assets => src/assets}/10.png | Bin {assets => src/assets}/11.png | Bin {assets => src/assets}/12.png | Bin {assets => src/assets}/13.png | Bin {assets => src/assets}/14.png | Bin {assets => src/assets}/15.png | Bin {assets => src/assets}/16.png | Bin {assets => src/assets}/17.png | Bin {assets => src/assets}/18.png | Bin {assets => src/assets}/19.png | Bin {assets => src/assets}/2.png | Bin {assets => src/assets}/20.png | Bin {assets => src/assets}/21.png | Bin {assets => src/assets}/22.png | Bin {assets => src/assets}/23.png | Bin {assets => src/assets}/24.png | Bin {assets => src/assets}/25.png | Bin {assets => src/assets}/26.png | Bin {assets => src/assets}/27.png | Bin {assets => src/assets}/28.png | Bin {assets => src/assets}/29.png | Bin {assets => src/assets}/3.png | Bin {assets => src/assets}/30.png | Bin {assets => src/assets}/31.png | Bin {assets => src/assets}/32.png | Bin {assets => src/assets}/33.png | Bin {assets => src/assets}/34.png | Bin {assets => src/assets}/35.png | Bin {assets => src/assets}/36.png | Bin {assets => src/assets}/37.png | Bin {assets => src/assets}/38.png | Bin {assets => src/assets}/39.png | Bin {assets => src/assets}/4.png | Bin {assets => src/assets}/40.png | Bin {assets => src/assets}/41.png | Bin {assets => src/assets}/42.png | Bin {assets => src/assets}/43.png | Bin {assets => src/assets}/44.png | Bin {assets => src/assets}/45.png | Bin {assets => src/assets}/46.png | Bin {assets => src/assets}/47.png | Bin {assets => src/assets}/48.png | Bin {assets => src/assets}/49.png | Bin {assets => src/assets}/5.png | Bin {assets => src/assets}/50.png | Bin {assets => src/assets}/51.png | Bin {assets => src/assets}/52.png | Bin {assets => src/assets}/53.png | Bin {assets => src/assets}/54.png | Bin {assets => src/assets}/55.png | Bin {assets => src/assets}/56.png | Bin {assets => src/assets}/57.png | Bin {assets => src/assets}/58.png | Bin {assets => src/assets}/59.png | Bin {assets => src/assets}/6.png | Bin {assets => src/assets}/60.png | Bin {assets => src/assets}/61.png | Bin {assets => src/assets}/62.png | Bin {assets => src/assets}/63.png | Bin {assets => src/assets}/7.png | Bin {assets => src/assets}/8.png | Bin {assets => src/assets}/9.png | Bin src/chapter_2.md | 20 ++++++++++++-------- src/chapter_3/chapter_3_2.md | 4 ++-- src/chapter_3/chapter_3_3.md | 3 ++- src/chapter_3/chapter_3_4.md | 2 +- src/chapter_3/chapter_3_5.md | 2 +- src/chapter_3/chapter_3_6.md | 6 +++--- src/chapter_3/chapter_3_7.md | 3 ++- src/chapter_3/chapter_3_7_1.md | 26 +++++++++++++------------- src/chapter_3/chapter_3_7_2.md | 17 ++++++++--------- src/chapter_3/chapter_3_7_3.md | 5 ++--- 74 files changed, 59 insertions(+), 42 deletions(-) rename {assets => src/assets}/1.png (100%) rename {assets => src/assets}/10.png (100%) rename {assets => src/assets}/11.png (100%) rename {assets => src/assets}/12.png (100%) rename {assets => src/assets}/13.png (100%) rename {assets => src/assets}/14.png (100%) rename {assets => src/assets}/15.png (100%) rename {assets => src/assets}/16.png (100%) rename {assets => src/assets}/17.png (100%) rename {assets => src/assets}/18.png (100%) rename {assets => src/assets}/19.png (100%) rename {assets => src/assets}/2.png (100%) rename {assets => src/assets}/20.png (100%) rename {assets => src/assets}/21.png (100%) rename {assets => src/assets}/22.png (100%) rename {assets => src/assets}/23.png (100%) rename {assets => src/assets}/24.png (100%) rename {assets => src/assets}/25.png (100%) rename {assets => src/assets}/26.png (100%) rename {assets => src/assets}/27.png (100%) rename {assets => src/assets}/28.png (100%) rename {assets => src/assets}/29.png (100%) rename {assets => src/assets}/3.png (100%) rename {assets => src/assets}/30.png (100%) rename {assets => src/assets}/31.png (100%) rename {assets => src/assets}/32.png (100%) rename {assets => src/assets}/33.png (100%) rename {assets => src/assets}/34.png (100%) rename {assets => src/assets}/35.png (100%) rename {assets => src/assets}/36.png (100%) rename {assets => src/assets}/37.png (100%) rename {assets => src/assets}/38.png (100%) rename {assets => src/assets}/39.png (100%) rename {assets => src/assets}/4.png (100%) rename {assets => src/assets}/40.png (100%) rename {assets => src/assets}/41.png (100%) rename {assets => src/assets}/42.png (100%) rename {assets => src/assets}/43.png (100%) rename {assets => src/assets}/44.png (100%) rename {assets => src/assets}/45.png (100%) rename {assets => src/assets}/46.png (100%) rename {assets => src/assets}/47.png (100%) rename {assets => src/assets}/48.png (100%) rename {assets => src/assets}/49.png (100%) rename {assets => src/assets}/5.png (100%) rename {assets => src/assets}/50.png (100%) rename {assets => src/assets}/51.png (100%) rename {assets => src/assets}/52.png (100%) rename {assets => src/assets}/53.png (100%) rename {assets => src/assets}/54.png (100%) rename {assets => src/assets}/55.png (100%) rename {assets => src/assets}/56.png (100%) rename {assets => src/assets}/57.png (100%) rename {assets => src/assets}/58.png (100%) rename {assets => src/assets}/59.png (100%) rename {assets => src/assets}/6.png (100%) rename {assets => src/assets}/60.png (100%) rename {assets => src/assets}/61.png (100%) rename {assets => src/assets}/62.png (100%) rename {assets => src/assets}/63.png (100%) rename {assets => src/assets}/7.png (100%) rename {assets => src/assets}/8.png (100%) rename {assets => src/assets}/9.png (100%) diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 369ba26..865028e 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -1,3 +1,16 @@ # Summary - [1 前言:为什么写这本书](./chapter_1.md) +- [2 欢迎来到Rust的世界](./chapter_2.md) +- [3 Rust基础]() + - [3.1 变量和可变性](./chapter_3/chapter_3_1.md) + - [3.2 基本数据类型](./chapter_3/chapter_3_2.md) + - [3.3 函数](./chapter_3/chapter_3_3.md) + - [3.4 注释](./chapter_3/chapter_3_4.md) + - [3.5 控制流](./chapter_3/chapter_3_5.md) + - [3.6 Rust内存模型](./chapter_3/chapter_3_6.md) + - [3.7 所有权](./chapter_3/chapter_3_7.md) + - [3.7.1 所有权介绍](./chapter_3/chapter_3_7_1.md) + - [3.7.2 引用与借用](./chapter_3/chapter_3_7_2.md) + - [3.7.3 Slice类型](./chapter_3/chapter_3_7_3.md) +- [4 Rust使用技巧]() diff --git a/assets/1.png b/src/assets/1.png similarity index 100% rename from assets/1.png rename to src/assets/1.png diff --git a/assets/10.png b/src/assets/10.png similarity index 100% rename from assets/10.png rename to src/assets/10.png diff --git a/assets/11.png b/src/assets/11.png similarity index 100% rename from assets/11.png rename to src/assets/11.png diff --git a/assets/12.png b/src/assets/12.png similarity index 100% rename from assets/12.png rename to src/assets/12.png diff --git a/assets/13.png b/src/assets/13.png similarity index 100% rename from assets/13.png rename to src/assets/13.png diff --git a/assets/14.png b/src/assets/14.png similarity index 100% rename from assets/14.png rename to src/assets/14.png diff --git a/assets/15.png b/src/assets/15.png similarity index 100% rename from assets/15.png rename to src/assets/15.png diff --git a/assets/16.png b/src/assets/16.png similarity index 100% rename from assets/16.png rename to src/assets/16.png diff --git a/assets/17.png b/src/assets/17.png similarity index 100% rename from assets/17.png rename to src/assets/17.png diff --git a/assets/18.png b/src/assets/18.png similarity index 100% rename from assets/18.png rename to src/assets/18.png diff --git a/assets/19.png b/src/assets/19.png similarity index 100% rename from assets/19.png rename to src/assets/19.png diff --git a/assets/2.png b/src/assets/2.png similarity index 100% rename from assets/2.png rename to src/assets/2.png diff --git a/assets/20.png b/src/assets/20.png similarity index 100% rename from assets/20.png rename to src/assets/20.png diff --git a/assets/21.png b/src/assets/21.png similarity index 100% rename from assets/21.png rename to src/assets/21.png diff --git a/assets/22.png b/src/assets/22.png similarity index 100% rename from assets/22.png rename to src/assets/22.png diff --git a/assets/23.png b/src/assets/23.png similarity index 100% rename from assets/23.png rename to src/assets/23.png diff --git a/assets/24.png b/src/assets/24.png similarity index 100% rename from assets/24.png rename to src/assets/24.png diff --git a/assets/25.png b/src/assets/25.png similarity index 100% rename from assets/25.png rename to src/assets/25.png diff --git a/assets/26.png b/src/assets/26.png similarity index 100% rename from assets/26.png rename to src/assets/26.png diff --git a/assets/27.png b/src/assets/27.png similarity index 100% rename from assets/27.png rename to src/assets/27.png diff --git a/assets/28.png b/src/assets/28.png similarity index 100% rename from assets/28.png rename to src/assets/28.png diff --git a/assets/29.png b/src/assets/29.png similarity index 100% rename from assets/29.png rename to src/assets/29.png diff --git a/assets/3.png b/src/assets/3.png similarity index 100% rename from assets/3.png rename to src/assets/3.png diff --git a/assets/30.png b/src/assets/30.png similarity index 100% rename from assets/30.png rename to src/assets/30.png diff --git a/assets/31.png b/src/assets/31.png similarity index 100% rename from assets/31.png rename to src/assets/31.png diff --git a/assets/32.png b/src/assets/32.png similarity index 100% rename from assets/32.png rename to src/assets/32.png diff --git a/assets/33.png b/src/assets/33.png similarity index 100% rename from assets/33.png rename to src/assets/33.png diff --git a/assets/34.png b/src/assets/34.png similarity index 100% rename from assets/34.png rename to src/assets/34.png diff --git a/assets/35.png b/src/assets/35.png similarity index 100% rename from assets/35.png rename to src/assets/35.png diff --git a/assets/36.png b/src/assets/36.png similarity index 100% rename from assets/36.png rename to src/assets/36.png diff --git a/assets/37.png b/src/assets/37.png similarity index 100% rename from assets/37.png rename to src/assets/37.png diff --git a/assets/38.png b/src/assets/38.png similarity index 100% rename from assets/38.png rename to src/assets/38.png diff --git a/assets/39.png b/src/assets/39.png similarity index 100% rename from assets/39.png rename to src/assets/39.png diff --git a/assets/4.png b/src/assets/4.png similarity index 100% rename from assets/4.png rename to src/assets/4.png diff --git a/assets/40.png b/src/assets/40.png similarity index 100% rename from assets/40.png rename to src/assets/40.png diff --git a/assets/41.png b/src/assets/41.png similarity index 100% rename from assets/41.png rename to src/assets/41.png diff --git a/assets/42.png b/src/assets/42.png similarity index 100% rename from assets/42.png rename to src/assets/42.png diff --git a/assets/43.png b/src/assets/43.png similarity index 100% rename from assets/43.png rename to src/assets/43.png diff --git a/assets/44.png b/src/assets/44.png similarity index 100% rename from assets/44.png rename to src/assets/44.png diff --git a/assets/45.png b/src/assets/45.png similarity index 100% rename from assets/45.png rename to src/assets/45.png diff --git a/assets/46.png b/src/assets/46.png similarity index 100% rename from assets/46.png rename to src/assets/46.png diff --git a/assets/47.png b/src/assets/47.png similarity index 100% rename from assets/47.png rename to src/assets/47.png diff --git a/assets/48.png b/src/assets/48.png similarity index 100% rename from assets/48.png rename to src/assets/48.png diff --git a/assets/49.png b/src/assets/49.png similarity index 100% rename from assets/49.png rename to src/assets/49.png diff --git a/assets/5.png b/src/assets/5.png similarity index 100% rename from assets/5.png rename to src/assets/5.png diff --git a/assets/50.png b/src/assets/50.png similarity index 100% rename from assets/50.png rename to src/assets/50.png diff --git a/assets/51.png b/src/assets/51.png similarity index 100% rename from assets/51.png rename to src/assets/51.png diff --git a/assets/52.png b/src/assets/52.png similarity index 100% rename from assets/52.png rename to src/assets/52.png diff --git a/assets/53.png b/src/assets/53.png similarity index 100% rename from assets/53.png rename to src/assets/53.png diff --git a/assets/54.png b/src/assets/54.png similarity index 100% rename from assets/54.png rename to src/assets/54.png diff --git a/assets/55.png b/src/assets/55.png similarity index 100% rename from assets/55.png rename to src/assets/55.png diff --git a/assets/56.png b/src/assets/56.png similarity index 100% rename from assets/56.png rename to src/assets/56.png diff --git a/assets/57.png b/src/assets/57.png similarity index 100% rename from assets/57.png rename to src/assets/57.png diff --git a/assets/58.png b/src/assets/58.png similarity index 100% rename from assets/58.png rename to src/assets/58.png diff --git a/assets/59.png b/src/assets/59.png similarity index 100% rename from assets/59.png rename to src/assets/59.png diff --git a/assets/6.png b/src/assets/6.png similarity index 100% rename from assets/6.png rename to src/assets/6.png diff --git a/assets/60.png b/src/assets/60.png similarity index 100% rename from assets/60.png rename to src/assets/60.png diff --git a/assets/61.png b/src/assets/61.png similarity index 100% rename from assets/61.png rename to src/assets/61.png diff --git a/assets/62.png b/src/assets/62.png similarity index 100% rename from assets/62.png rename to src/assets/62.png diff --git a/assets/63.png b/src/assets/63.png similarity index 100% rename from assets/63.png rename to src/assets/63.png diff --git a/assets/7.png b/src/assets/7.png similarity index 100% rename from assets/7.png rename to src/assets/7.png diff --git a/assets/8.png b/src/assets/8.png similarity index 100% rename from assets/8.png rename to src/assets/8.png diff --git a/assets/9.png b/src/assets/9.png similarity index 100% rename from assets/9.png rename to src/assets/9.png diff --git a/src/chapter_2.md b/src/chapter_2.md index 237ce3e..ce787eb 100644 --- a/src/chapter_2.md +++ b/src/chapter_2.md @@ -1,5 +1,5 @@ # 2 欢迎来到Rust的世界 -## 2.1 为什么选择Rust +## 2.1 为什么选择Rust ### 2.1.1 Rust的历史与背景 Rust是一种现代的系统编程语言,它注重性能、安全性和并发。Rust最初由Mozilla研究院的Graydon Hoare于2006年开始设计,最早的目标是为了解决C++在系统编程领域的一些痛点。在2010年,Mozilla正式开始支持这个项目,从那时起,Rust开始迅速发展并逐渐成为一个强大的编程语言。 @@ -17,7 +17,7 @@ Rust的设计理念是将系统编程的性能与安全性相结合。它的核 - 2015年:Rust 1.0正式发布,稳定版本的Rust开始对外提供支持。 - 2016年:Rust开始获得广泛关注,社区逐渐壮大。 - 2018年:WebAssembly的推广使得Rust成为一个受欢迎的前端编程语言。 - + 3. 社区与生态系统 随着Rust的发展,其社区和生态系统也在不断壮大。Rust编程语言被广泛应用于各种领域,如网络编程、游戏开发、操作系统、嵌入式系统、区块链等。此外,Rust已经连续多年被Stack Overflow开发者调查评为最受欢迎的编程语言。 @@ -114,7 +114,8 @@ Rust在系统工具和实用程序开发中也表现出色。Rust编写的工具 1. 对于macOS和Linux用户 通过如下命令进行安装: -``` + +```bash curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh ``` @@ -131,7 +132,8 @@ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh ### 2.2.2 验证安装 安装完成后,可以输入如下命令验证安装: -``` + +```bash rustc --version ``` @@ -140,12 +142,14 @@ rustc --version ### 2.3.1 创建一个新的Rust项目 Rust使用Cargo作为官方的构建工具和包管理器,下面通过Cargo创建一个新的Rust项目: -``` + +```bash cargo new hello_world ``` + 创建后,可以看到整个目录的结构如下: -![目录结构](../assets/62.png) +![目录结构](./assets/62.png) 其中Cargo.toml是项目的配置文件,src为源代码目录,main.rs为主程序文件。 @@ -162,13 +166,13 @@ fn main() { ### 2.3.3 编译并运行Hello, World程序 运行程序需要进去到项目目录中,然后运行cargo run命令即可,步骤如下: -``` +```bash cd hello_world cargo run ``` 运行结果如下: -![运行结果](../assets/63.png) +![运行结果](./assets/63.png) ### 2.3.4 理解Rust源码的基本结构 下面简单介绍Rust源码的结构。 diff --git a/src/chapter_3/chapter_3_2.md b/src/chapter_3/chapter_3_2.md index d6fed86..49c0d51 100644 --- a/src/chapter_3/chapter_3_2.md +++ b/src/chapter_3/chapter_3_2.md @@ -1,4 +1,4 @@ -## 3.2 基本数据类型(Basic Data Type) +## 3.2 基本数据类型 Rust是静态类型语言,编译时就必须知道所有变量的类型。根据值以及其使用方式,Rust编译器通常能自动推导出变量的类型。 Rust有两种数据类型子集,分别是:标量(scalar)类型和复合(compound)类型。 @@ -76,7 +76,7 @@ Rust中的布尔型用bool表示,有两个可能的值,为true和false。布 fn main() { // 定义方式 let a: bool = true; - let b: bool = false; + let b: bool = false; // 使用场景 if a { diff --git a/src/chapter_3/chapter_3_3.md b/src/chapter_3/chapter_3_3.md index f8a560c..be35dc2 100644 --- a/src/chapter_3/chapter_3_3.md +++ b/src/chapter_3/chapter_3_3.md @@ -1,4 +1,5 @@ -## 3.3 函数(Function) +## 3.3 函数 + ### 3.3.1. 函数定义 fn关键字、函数名、函数参数名及其类型(如果有的话)、返回值类型(如果有的话)组成函数签名, 加上由一对花括号包含的函数体组成函数。例子如下: ```Rust diff --git a/src/chapter_3/chapter_3_4.md b/src/chapter_3/chapter_3_4.md index d032ccc..7d30084 100644 --- a/src/chapter_3/chapter_3_4.md +++ b/src/chapter_3/chapter_3_4.md @@ -94,4 +94,4 @@ fn main() { cargo doc --open ``` 将打开上面代码里面文档注释生成的文档,如下图: -![注释](../../assets/1.png) +![注释](../assets/1.png) diff --git a/src/chapter_3/chapter_3_5.md b/src/chapter_3/chapter_3_5.md index 2b0694e..55f5bfe 100644 --- a/src/chapter_3/chapter_3_5.md +++ b/src/chapter_3/chapter_3_5.md @@ -1,4 +1,4 @@ -## 3.5 控制流(Control Flow) +## 3.5 控制流 Rust中的控制流结构主要包括: diff --git a/src/chapter_3/chapter_3_6.md b/src/chapter_3/chapter_3_6.md index b0b6318..b1be7dd 100644 --- a/src/chapter_3/chapter_3_6.md +++ b/src/chapter_3/chapter_3_6.md @@ -1,6 +1,6 @@ ## 3.6 Rust内存模型 ### 3.6.1 Rust程序内存布局 -![注释](../../assets/2.png) +![注释](../assets/2.png) 上图是一张linux系统上Rust程序的内存布局图。在linux操作系统中,会划分固定的区域给内核使用,即上图中的内核空间;应用程序使用的是用户空间。 @@ -38,7 +38,7 @@ fn main() { } ``` 对于上面的代码,在执行第17行和第18行的栈帧示意图如下: -![注释](../../assets/3.png) +![注释](../assets/3.png) 这里需要注意的是两个帧对应同样的内存地址,这是因为在调用完f1函数后,其对应的栈帧释放(释放的实际意义就是这段内存可以被重新分配了),然后调用f2函数为其分配栈帧时从同样的地址进行分配。 @@ -51,4 +51,4 @@ Rust没有GC,但通过其独特的机制管理内存,程序员不用手动 栈中存储的所有数据都必须占用(在编译时就)已知且固定的大小。编译时大小未知或可能变化的数据,存储在堆上。 数据存放到栈上时,是直接将数据放到栈内存。 当数据需要存放到堆上时,内存分配器则是根据数据的大小,在堆内存找到合适大小的空区域存放,把它标记为已使用,并返回一个表示该位置地址的指针。该指针存储在栈上,当需要访问具体的数据时,必须先访问指针,然后通过指针找到堆上的位置,从而访问数据。这个过程可以用下图表示: -![注释](../../assets/4.png) +![注释](../assets/4.png) diff --git a/src/chapter_3/chapter_3_7.md b/src/chapter_3/chapter_3_7.md index 2c387cf..fac4e33 100644 --- a/src/chapter_3/chapter_3_7.md +++ b/src/chapter_3/chapter_3_7.md @@ -1,4 +1,5 @@ -## 3.7.所有权(Ownership) +## 3.7.所有权 + - [所有权介绍](./chapter_3_7_1.md) - [引用与借用](./chapter_3_7_2.md) - [slice类型](./chapter_3_7_3.md) diff --git a/src/chapter_3/chapter_3_7_1.md b/src/chapter_3/chapter_3_7_1.md index 8bf6684..1a698d7 100644 --- a/src/chapter_3/chapter_3_7_1.md +++ b/src/chapter_3/chapter_3_7_1.md @@ -26,12 +26,12 @@ fn main() { ```Rust fn f() { let b = 1u32; // --------------------------------| - let c = 2u32; //-----------| | + let c = 2u32; //-----------| | // | | // | |---b的作用域范围 println!("b = {:?}", b);// |--c的作用与范围 | println!("c = {:?}", c);// | | - //-----------| -------------------| + //-----------| -------------------| } fn main() { @@ -95,7 +95,7 @@ pub struct String { Vec类型的定义如下: ```Rust pub struct Vec { - buf: RawVec, + buf: RawVec, len: usize, // 长度 } ``` @@ -118,7 +118,7 @@ struct String { 更进一步的简化,可以得到String类型本质如下: ```Rust struct String { - ptr:NonNull, + ptr:NonNull, cap: usize, len: usize, } @@ -139,7 +139,7 @@ fn main() { ``` 在第2行定义String类型时,并不能确定最终字符串的大小,所以字符串内容本身应该存储在堆上。结合什么String类型的本质的内容,可以得到String类型的存储如下: -![注释](../../assets/5.png) +![注释](../assets/5.png) String类型本身是三个字段(指针、长度、容量),在编译时是已知的大小,存储在栈上;String类型绑定的字符串(在上面代码中是“AB”)在编译时大小未知,是运行时在堆上分配内存,分配后的内存地址保存在String类型的指针字段中,内存大小保存在cap字段中,内存上存储的字符串长度保存在len字段中。 @@ -171,11 +171,11 @@ fn main() { ``` s是String类型,字符串“Hello world!”是存储在堆内存上的,其内存布局如下: -![注释](../../assets/6.png) +![注释](../assets/6.png) 当执行let s1 = s后,内存布局如下: -![注释](../../assets/7.png) +![注释](../assets/7.png) 当let s1 = s执行后,就发生了所有权的转移,String类型值的所有权从s转移到了s1。此时Rust认为原来的s不再有效。因此,上面代码第4行打开编译将会出错。 @@ -185,14 +185,14 @@ s是String类型,字符串“Hello world!”是存储在堆内存上的, 只拷贝栈上的内容,就叫做浅拷贝。 对于上面的String类型,执行let s1 = s后,只把s的ptr、len、cap中的值拷贝给s1的ptr、len、cap的值,这种就叫做浅拷贝。浅拷贝发生后,s的ptr和s1的ptr都指向同样的堆内存。内存布局如下: -![注释](../../assets/8.png) +![注释](../assets/8.png) - 深拷贝 除了拷贝栈上的内容外,还拷贝堆内存中的内容,就叫做深拷贝。 对于上面的String类型,执行let s1 = s后,除了把s的len、cap中的值拷贝给s1的len、cap外,还在堆上重新分配一块内存,将s的ptr指向的堆内存的内容拷贝到这块内存,然后s1的ptr指向这块内存,这种拷贝就叫做深拷贝。深拷贝发生后,s的ptr和s1的ptr指向不同的堆内存,但是堆内存中存储的内容一样。深拷贝发生后的内存布局如下: -![注释](../../assets/9.png) +![注释](../assets/9.png) 显然,**Rust中变量赋值(Rust中叫所有权转移)使用的是浅拷贝**。 @@ -227,11 +227,11 @@ Rust中,默认实现了Copy trait的类型有: ```Rust fn main() { let s = String::from("hello"); - takes_ownership(s); + takes_ownership(s); // println!("s: {:?}", s);//打开编译会报错,因为s的所有权在上一行已经转移到take_ownership函数中了 - let x = 5; - makes_copy(x); + let x = 5; + makes_copy(x); println!("x: {:?}", x);//不会报错,因为上一行将x传到makes_copy函数时会自动拷贝x的值到函数中 } @@ -239,7 +239,7 @@ fn takes_ownership(some_string: String) { println!("{}", some_string); } -fn makes_copy(some_integer: i32) { +fn makes_copy(some_integer: i32) { println!("{}", some_integer); } ``` diff --git a/src/chapter_3/chapter_3_7_2.md b/src/chapter_3/chapter_3_7_2.md index ec2c0ac..64a9652 100644 --- a/src/chapter_3/chapter_3_7_2.md +++ b/src/chapter_3/chapter_3_7_2.md @@ -40,7 +40,7 @@ fn print(s: String) -> String { ``` 上面代码中,变量a、b、c、d的内存布局如下: -![注释](../../assets/10.png) +![注释](../assets/10.png) **获取变量的引用,称之为借用** 。通过借用,允许使用被引用变量绑定的值,同时又没有移动该变量的所有权。前面的示例代码可以变成如下: ```Rust @@ -178,13 +178,13 @@ fn main() { ``` (2)限制二:**同一作用域,可变引用和不可变引用不能同时存在**。如下代码编译错误: -```Rust +```Rust fn main() { let mut s = String::from("hello"); let r1 = &s; // 没问题 let r2 = &s; // 没问题 let r3 = &mut s; // 大问题,同时存在两个s的引用和一个可变引用 - println!("{}, {}", r1, r2); + println!("{}, {}", r1, r2); println!("{}", r3); } ``` @@ -195,7 +195,7 @@ fn main() { let r1 = &s; // 没问题 let r2 = &s; // 没问题 - println!("{} and {}", r1, r2); + println!("{} and {}", r1, r2); // 此位置之后 r1 和 r2 不再使用, 新编译器中: r1和r2离开了其作用域 let r3 = &mut s; // 没问题,因为r1和r2已不存在,没有同时存在对s的引用和可变引用 @@ -240,11 +240,11 @@ int main() ``` 在执行第14行前,其内存布局为: -![注释](../../assets/11.png) +![注释](../assets/11.png) 当执行第14行后,变成如下: -![注释](../../assets/12.png) +![注释](../assets/12.png) 第14行执行后,ptr就变成了一个悬垂指针(或者交悬垂引用),然后在第16行继续使用ptr,则会发生错误。 @@ -264,13 +264,13 @@ fn dangle() -> &String { *思考:为什么下面的代码是正确的* ? ```Rust fn main() { - let s = no_dangle(); + let s = no_dangle(); println!("s = {:?}", s); } fn no_dangle() -> String { let s = String::from("hello"); - s + s } // 此处s虽然离开了函数这个作用域范围,但是它的所有权是被转移出去了,值并没有释放 ``` @@ -279,4 +279,3 @@ fn no_dangle() -> String { - 在任意给定时间,要么 只能有一个可变引用,要么 只能有多个不可变引用。 - 引用必须总是有效的(不能是悬垂引用)。 - diff --git a/src/chapter_3/chapter_3_7_3.md b/src/chapter_3/chapter_3_7_3.md index eebef7c..11ceb96 100644 --- a/src/chapter_3/chapter_3_7_3.md +++ b/src/chapter_3/chapter_3_7_3.md @@ -18,7 +18,7 @@ fn main(){ let arr_slice1 = &arr[..=1]; println!("{:?}", arr_slice1); // [11,22]; - let arr_slice2 = &mut arr[..=1]; + let arr_slice2 = &mut arr[..=1]; arr_slice2[0] = 1111; println!("{:?}", arr_slice2);// [1111,22]; println!("{:?}", arr);// [1111,22,33,44]; @@ -44,7 +44,7 @@ fn main() { &str和&String的内存布局如下: -![注释](../../assets/13.png) +![注释](../assets/13.png) #### 3. 其它Slice 数组的Slice,如下: @@ -63,4 +63,3 @@ fn main() { println!("b: {:?}", b); } ``` -