类型

在 Rust 程序中,每个变量、条目和值都有一个类型。 一个 类型 定义了其存储在内存中的解释方式,以及该值可执行的相关操作。

内置类型与语言编译器紧密集成,实现方式与用户定义类型有所不同。 用户定义类型受到语法规则的限制,因而具有有限的功能。

Rust 类型包括:

类型表达式

语法
类型 :
      无约束类型组
   | ImplTrait类型
   | Trait对象类型

无约束类型组 :
      括号类型
   | ImplTrait类型单约束
   | Trait对象类型单约束
   | 类型路径
   | 元组类型
   | 永不类型
   | 原始指针类型
   | 引用类型
   | 数组类型
   | 切片类型
   | 推断类型
   | 限定路径类型
   | 裸函数类型
   | 宏调用

在上面的 类型 语法规则中所定义的 类型表达式 描述的类型语法,可对应包含以下类型:

译注: rust 中相关语法和概念有很好的统一性,这里将类型归并到表达式概念下就是很好的体现。 这里要理解的一点是,之所以将类型归并到表达式,是强调了类型同样存在的求值机制, 即多个类型组合后的表达式会求值为一个更为复杂的类型结构,而通过这一类型去约束其他类型和值。

括号类型

括号类型 :
   ( 类型 )

有时,类型组合可能不明确,需要添加括号以区分。 例如, 引用类型类型约束+ 运算符对应的类型边界容易歧义,则需要使用括号。 这个消除歧义的语法使用 无约束类型组 语法规则,而不是 类型

#![allow(unused)]
fn main() {
use std::any::Any;
type T<'a> = &'a (dyn Any + Send);
}

递归类型

具名类型 - 结构体枚举联合体 - 可以是递归的。 也就是说,每个 enum 变量或 structunion 字段可以直接或间接地引用封闭的 enumstruct 类型本身。 这种递归有所限制:

  • 递归类型必须包含在递归中的具名类型表达式中 (不是仅仅是 类型别名 ,其他结构类型,例如 数组元组 也是) 。因此, type Rec = &'static [Rec] 是不允许的。

  • 递归类型的大小必须是有限的;换言之,类型的递归字段必须是 指针

以下是 递归 类型及其使用的一个例子:

#![allow(unused)]
fn main() {
enum List<T> {
    Nil,
    Cons(T, Box<List<T>>)
}

let a: List<i32> = List::Cons(7, Box::new(List::Cons(13, Box::new(List::Nil))));
}