- 通过
#[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZI50wIh1-1685693144796)(null)]),不带感叹号的
#[allow]仅为下一行代码提供属性,属性有多种分类,文中出现的
allow属性称为诊断属性(Diagnostics),详见[诊断属性](https://doc.rust-lang.org/reference/attributes/diagnostics.html#lint-check-attributes);诊断属性还包括
warn,
forbid,
deprecated,
must_use`等; - 单位类型(unit type)是一个长度为0的元组(zero-length tuple),用一对小括号
()
表示,当函数没有返回类型时返回()
,或者函数以分号;
结尾的时候也是隐式返回了()
类型; - 返回值是感叹号
!
时表示永不返回,感叹号在这里可以看做是Never
类型,按时该函数要么永不返回,要么必定会crash; - 3.2使用
struct
关键字来定义一个复杂的类型,使用了derive
关键字来让编译器生成某些属性,出现了vec!
宏来快速初始化一个Vec<u8>
类型; - 图3.1给出了一个自定义结构的内存分布图,从图中可以看出
String
类型由3部分组成,第一部分是(ptr)指向堆的指针,第二部分(size)表示大小,即string的长度,第三部分(capacity)表示容量,表示堆上为这个string分配的最大容量,如果后续string继续增大,可能会重新在堆上分配空间,Vec<u8>
类型跟String
有类似的三个部分;
- 为一个新的结构起一个名字有两种方式,一种是
struct
关键字,一种是type
关键字,type
通常用于为某一种类型起别名(alias),或者在特征trait
中制定关联类型(associate type),详见associated-items; listing 3.3
给了一系列文件IO的api,其中String::from_utf8_lossy(&buffer)
可以把Vec<u8>
类型转换成String
类型;- 3.3节阐述了rust与其他语言中类的不同,如图所示,大部分支持继承(inheritance)的语言会把类的方法与成员放在一起,而rust是分开实现的,因而rust的类并不支持面向对象语言的继承属性;
- 84页注解简单探讨了一下函数(function)和方法(method)的区别,作者认为函数是纯粹的(pure),它的行为仅由它的参数决定,而方法通常跟类绑定,第一个参数是
self
或者相应的借用,然而也有例外,例如实现了静态方法(static method)的类的第一个参数就不是self
; - 3.4节出现了一种用到
unsafe
关键字的场景,也就是修改静态全局变量的时候必须要用unsafe包裹,避免多个地方同时修改一个全局变量,全局变量根据习惯要全部大写; const
和let
的区别,let
绑定的对象具有内部可变性,例如std::sync::Arc
和std::rc::Rc
,通过clone等操作会改变其内部引用计数的值,在编译器的角度来看,let
更强调的是为某一块数据起别名(aliasing)而不是它的不可变性(immutability);- 3.4和3.5节主要讲了用
enum
来处理错误类型,比较简单; - 实现
PartialEq
特征的类可以用==
来进行比较;实现Display
特征的类可以在println!中用{}
结构化输出,Display
特征要求实现fmt(&self, f: &mut fmt::Formatter)
方法,实现过程中可以使用write!
宏来简化实现过程; - 3.7节讲了类和成员的可见性,默认都是Private,给类加了
pub
关键字表示该类是public,但是其成员还是private,如果需要成员也是可见的,需要在成员前面加上pub; - 3.8节讲了给代码加文档的方法,
///
仅为之后的代码作注解,而//!
是为整个模块作注解,可以横向比较前面的#![allow]
和#[allow]
,生成注解的方式是rustdoc xx.rs
,跟之前的cargo doc
类似,不过cargo是针对整个项目生成文档; ///
生成的文档支持markdown语法
Rust in Action笔记 第三章 复合数据类型
最新推荐文章于 2024-08-31 13:17:47 发布