第一章

第二章:语言精要

Rust 语言基本构成:

  • 语言规范
    • The Rust Reference
    • RFC
  • 编译器
    • rustc
    • 使用 LLVM 作为编译器后端
  • 核心库
    • 不依赖操作系统和网络等相关库
    • 不提供兵法和 I/O
    • 通过 #![no_std] 使用
  • 标准库
    • 核心库的内容
    • 并发、I/O和运行时
    • 平台抽象
    • 底层操作接口
    • 错误处理,迭代器等
  • 包管理器

    • cargo

      语句与表达式

      Rust 中的语法可以分成两大类
  • 语句(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 声明创建变量绑定开始,到超出词法作用域的范围时结束。

函数指针

Rust 中函数时一等公民,可以作为参数/返回值。

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:可变原生指针
  • never 类型
    • 即 !
    • 用于表示永远不可能有返回值的计算类型
  • 复合数据类型
    • Rust 提供了 4 中复合数据类型
      • Tuple
      • Struct
      • Enum
      • Union
    • Tuple
      • 一种异构有限序列
      • 可以通过模式匹配解构 Tuple
      • Tuple 中只有一个值时需要加 ,
      • 单元类型就是一个空 Tuple
    • Struct
      • Rust 提供三种 Struct
        • 具名结构体(Named-Field Struct)
        • 元组结构体(Tuple-Like Struct)
        • 单元结构体(Unit-Like Struct)
    • Enum

常用集合类型

Rust std::collections 模块下有四种通用即可类型,分别如下:

  • 线性序列:
    • Vec
    • VecDeque
    • LinkedList
  • k-v pair
    • HashMap
    • BTreeMap
  • 集合类型
    • HashSet
    • BtreeSet
  • 优先队列

    • BinaryHeap

      智能指针

      Box

      范型和 trait

      trait 是 Rust 实现零成本抽象的基石,它有如下机制
  • trait 是 Rust 唯一的接口抽象方式

  • 可以静态生成,可以动态调用
  • 可以当作标记类型拥有某些特定行为的“标签”来使用

简单来说,trait 是对类型行为的抽象。

错误处理

通过返回 Result 类型的方式进行的。

表达式优先级

*, /, %
+, -
<<, >>
&
^
|
==, !=, <=, >=, <, >
&&
||

注释与打印

普通注释:和 c 类似
文档注释:

  • 内部支持 Markdown 语法
  • 支持对文档中的实例代码进行测试
  • 可以通过 rustdoc 工具生成 HTML 文档
  • /// 一般用于函数/结构体的说明,置于说明对象的上方
  • //! 一般用于说明整个模块的功能,置于模块文件的头部

小结

Rust 是一门表达式语言,Rust 中一切皆表达式。

第三章:类型系统