您现在的位置是:首页 >技术教程 >Rust in Action笔记 第三章 复合数据类型网站首页技术教程

Rust in Action笔记 第三章 复合数据类型

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