这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

Rust类型系统概述

Rust类型系统概述

1 - Rust类型大小

Rust类型大小

1.1 - [Rust编程之道笔记]类型大小

Rust编程之道一书 3.2.1 节类型大小

内容出处: Rust编程之道一书,第3章类型系统,3.2.1 类型大小

3.2 类型大小

编程语言中不同的类型本质上是内存占用空间和编码方式的不同,Rust也不例外。Rust没有GC,内存首先由编译期来分配,rust代码首先由编译期来分配, Rust 代码被编译为 LLVM IR,其中携带了内存分配的信息。

因此,Rust编译器需要实现知道类型的大小,才能分配合理的内存

可确定大小类型和动态大小类型

Rust 中绝大部分类型都是在编译期内可确定大小的类型(称为Sized Type),也有少量的动态大小的类型(Dynamic Sized Type,简写为 DST)。

对于DST,Rust提供了引用类型,因为引用总会有固定且在编译期已知的大小。如字符串切片 &str 就是一种引用类型 ,由指针和长度信息组成。

零大小类型

除了可确定大小类型和 DST 类型,Rust 还支持零大小类型(Zero Sized Type, ZST),如单元类型和单元结构体。

  • 单元类型和单元结构体大小为零
  • 由单元类型组成的数组大小也为零

ZST类型的特点是:值就是本身,运行时并不占用内存空间。

底类型

底类型(Bottom type)是院子类型理论的术语,其实是 never 类型,它的特点是:

  • 没有值
  • 是其他任意类型的子类型

如果说 ZST 类型表示“空”的话,那么底类型就是表示“无”。

Rust 中的底类型用 ! 表示,也被称为 Bang Type。

Rust 中有很多中情况确实没有值,但是为了类型安全,必须归入类型系统进行统一处理,这些情况包括:

  • 发散函数(Diverging Function):指会导致线程崩溃的 panic! 或者用于退出函数的 std::process::exit
  • continuebreak 关键字: 只是表示流程的跳转,并不会返回什么
  • loop 循环:虽然可以返回某个值,但是也有需要无限循环的时候
  • 空枚举,比如 enum Void{}

2 - Rust类型推导

Rust类型推导

2.1 - [Rust编程之道笔记]类型推导

Rust编程之道一书 3.2.2 节类型推导

内容出处: Rust编程之道一书,第3章类型系统,3.2.2 类型推导

3.2.2 类型推导

Rust 只能在局部范围内进行类型推导。

Turbofish操作符

当 Rust 无法从上下文中自动推导出类型的时候,编译期会通过错误信息提示并要求添加类型标注。

标注类型的方式:

fn main() {
    let x = "1";
    //标注变量的类型
    let int_x : i32 = x.parse().unwrap();
    //通过 Turbofish操作符 标注
    assert_eq!(x.parse::<i32>().unwrap(), 1);
}

类型推导的不足

总结:rust的类型推导还不够强大, 因此,编码时推荐尽量显式声明类型,避免麻烦。