类型
Rust 程序中的每个变量、 项 和值都有一个类型。 值 的 类型 定义了对持有它的内存的解释以及可以对该值执行的操作。
内置类型紧密地集成到语言中,其方式非常复杂,无法在用户定义类型中模拟。
用户定义类型的能力有限。
类型列表如下:
- 原语类型:
- 序列类型:
- 用户定义类型:
- 函数类型:
- 指针类型:
- 特型类型:
类型表达式
Syntax
Type →
TypeNoBounds
| ImplTraitType
| TraitObjectType
TypeNoBounds →
ParenthesizedType
| ImplTraitTypeOneBound
| TraitObjectTypeOneBound
| TypePath
| TupleType
| NeverType
| RawPointerType
| ReferenceType
| ArrayType
| SliceType
| InferredType
| QualifiedPathInType
| BareFunctionType
| MacroInvocation
上面 类型 语法格式规则中定义的 类型表达式 是引用类型的语法格式。它可以引用:
- 类型路径 可以引用:
- 推断类型 ,它要求编译器确定类型。
- 用于消除歧义的 括号 。
- never 类型。
- 展开为类型表达式的 宏 。
括号类型
Syntax
ParenthesizedType → ( Type )
在某些情况下,类型的组合可能会产生歧义。在类型周围使用括号以避免歧义。例如, 引用类型 中用于 特型边界 的 + 运算符不清楚边界应用于何处,因此需要使用括号。需要这种消除歧义的语法格式规则使用 TypeNoBounds 规则而不是 类型 。
#![allow(unused)]
fn main() {
use std::any::Any;
type T<'a> = &'a (dyn Any + Send);
}
递归类型
标称类型 —— 结构体 、 枚举 和 联合体 —— 可能是递归的。也就是说,每个 enum 变体或 struct 或 union 字段可以直接或间接地引用包围它的 enum 或 struct 类型本身。
这种递归有限制:
- 递归类型必须在递归中包含一个标称类型(不只是 类型别名 ,或者其他结构化类型,如 数组 或 元组 )。因此
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))));
}