第一章
第二章:语言精要
Rust 语言基本构成:
- 语言规范
- The Rust Reference
- RFC
- 编译器
- rustc
- 使用 LLVM 作为编译器后端
- 核心库
- 不依赖操作系统和网络等相关库
- 不提供兵法和 I/O
- 通过 #![no_std] 使用
- 标准库
- 核心库的内容
- 并发、I/O和运行时
- 平台抽象
- 底层操作接口
- 错误处理,迭代器等
包管理器
语句(Statement):
- 声明语句(Declaration statement)
- 表达式语句(Expression statement)
- 表达式(Expression)
TL;DR: Expressions evaluate to a value, they return that value. Statements do not.
变量与绑定
Rust 中的表达式一般可以分为:
- 位置表达式(Place Expression)(LValue)
- 值表达式(Value Expression)(RValue)
不可变绑定与可变绑定
所有权与引用
当位置表达式出现在值上下文中时,该位置表达式将会把内存地址转移给另一个位置表达式,这其实是所有权的转移。
函数与闭包
Rust 语言的作用域时静态作用域即词法作用域(Lexical Scope)。
变量绑定的生命周期遵循规律:从使用 let 声明创建变量绑定开始,到超出词法作用域的范围时结束。
函数指针
CTFE 机制
编译时函数执行(Compile-Time Function Execution)。可以用来支持 const_fn/const generics
Rust 中的 CTFE 是由 miri 来执行的。
闭包
闭包也叫匿名函数,其具有以下几个特点
Rust 中, match 分支使用了模式匹配技术。
- match 分支左边是模式,右边是执行代码
- 模式匹配同时也是一个表达式,和 if 表达式类似,所有分支必须返回同一个类型
- 左侧的恶事可以是不同的
- 可以使用操作符 @ 将模式中的值绑定给一个变量,供分支右侧的代码使用。这类匹配交绑定模式(Binding Mode)
match 表达式必须穷尽每一种可能,所以一般会使用通配符 _ 来处理剩余的情况。
基本数据类型
bool
- 基本数字类型
- 固定大小
- u8-u128
- i8-i128
- 动态大小
- usize: 取决于机器的字长
- isize:取决于机器的字长
- 浮点
- f32
- f64
- 固定大小
- 字符类型
- 单引号
- Unicode
- 每个字符占 4 字节
- 数组类型(Array)
- 特点
- 大小固定
- 元素均为同类型
- 默认不可变
- 签名: [T; N], N 是一个编译时常量
- 越界访问会报错
- 对于原始固定长度数组,只有实现 Copy trait 的类型才能作为其元素
- 特点
- 范围类型
- Range 1..10
- RangeInclusive 1..=10
- Slice
- 对一个数组(包括固定大小数组和动态数组)的引用片段
- str 字符串类型
- Rust 提供了原始的字符串类型 str,也叫做字符串切片。通常以不可变借用的形式存在,即 &str。
- 出于内存安全的考虑, Rust 将字符串分为两种类型
- 固定长度字符串,不可随便更改其长度:str
- 可以随意修改长度:String
- 原生指针
- Rust 提供了多种类型的指针
- Reference:本质上是一种非空指针。主要应用于 Safe Rust
- Raw Pointer:主要用于 Unsafe Rust
- fn Pointer
- Smart Pointer
- Rust 支持两种原生指针
- *const T :不可变原生指针
- *mut T:可变原生指针
- Rust 提供了多种类型的指针
- never 类型
- 即 !
- 用于表示永远不可能有返回值的计算类型
- 复合数据类型
- Rust 提供了 4 中复合数据类型
- Tuple
- Struct
- Enum
- Union
- Tuple
- 一种异构有限序列
- 可以通过模式匹配解构 Tuple
- Tuple 中只有一个值时需要加 ,
- 单元类型就是一个空 Tuple
- Struct
- Rust 提供三种 Struct
- 具名结构体(Named-Field Struct)
- 元组结构体(Tuple-Like Struct)
- 单元结构体(Unit-Like Struct)
- Rust 提供三种 Struct
- Enum
- Rust 提供了 4 中复合数据类型
常用集合类型
Rust std::collections 模块下有四种通用即可类型,分别如下:
- 线性序列:
- Vec
- VecDeque
- LinkedList
- k-v pair
- HashMap
- BTreeMap
- 集合类型
- HashSet
- BtreeSet
优先队列
trait 是 Rust 唯一的接口抽象方式
- 可以静态生成,可以动态调用
- 可以当作标记类型拥有某些特定行为的“标签”来使用
错误处理
表达式优先级
*, /, % |
---|
+, - |
<<, >> |
& |
^ |
| |
==, !=, <=, >=, <, > |
&& |
|| |
注释与打印
普通注释:和 c 类似
文档注释:
- 内部支持 Markdown 语法
- 支持对文档中的实例代码进行测试
- 可以通过 rustdoc 工具生成 HTML 文档
- /// 一般用于函数/结构体的说明,置于说明对象的上方
- //! 一般用于说明整个模块的功能,置于模块文件的头部
小结
Rust 是一门表达式语言,Rust 中一切皆表达式。