类型
Rust 程序中的每个变量、项目和值都有一个类型。_值的_ _类型_定义了保存它的内存的解释以及可以对该值执行的操作。
内置类型与语言紧密集成,其方式非常重要,用户定义的类型无法模拟。
类型列表如下
- 基本类型
- 序列类型
- 用户定义类型
- 函数类型
- 指针类型
- 特征类型
类型表达式
语法
类型 :
无边界类型
| ImplTraitType
| TraitObjectType无边界类型 :
带括号的类型
| ImplTraitTypeOneBound
| TraitObjectTypeOneBound
| 类型路径
| 元组类型
| NeverType
| 原始指针类型
| 引用类型
| 数组类型
| 切片类型
| 推断类型
| 类型中的限定路径
| 裸函数类型
| 宏调用
如上面的_类型_语法规则中定义的_类型表达式_是引用类型的语法。它可以引用
- 序列类型(元组、数组、切片)。
- 类型路径,可以引用
- 指针类型(引用、原始指针、函数指针)。
- 推断类型,它要求编译器确定类型。
- 括号,用于消除歧义。
- 特征类型:特征对象和impl trait。
- never 类型。
- 宏,扩展为类型表达式。
带括号的类型
带括号的类型 :
(
类型)
在某些情况下,类型的组合可能会产生歧义。使用括号括起类型以避免歧义。例如,引用类型中用于类型边界的 +
运算符不清楚边界应用于何处,因此需要使用括号。需要消除这种歧义的语法规则使用无边界类型规则而不是类型。
#![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)))); }