类型
在 Rust 程序中,每个变量、条目和值都有一个类型。值的类型定义了用于保存它的内存的解释以及可以对该值执行的操作。
内建类型紧密集成到语言中,其重要程度是用户自定义类型无法模拟的。
用户自定义类型具有有限的功能。
类型列表如下:
- 原始类型
- 序列类型
- 用户自定义类型
- 函数类型
- 指针类型
- 特征类型
类型表达式
语法
类型 :
TypeNoBounds
| ImplTraitType
| TraitObjectTypeTypeNoBounds :
ParenthesizedType
| ImplTraitTypeOneBound
| TraitObjectTypeOneBound
| TypePath
| TupleType
| NeverType
| RawPointerType
| ReferenceType
| ArrayType
| SliceType
| InferredType
| QualifiedPathInType
| BareFunctionType
| MacroInvocation
如上面的类型语法规则中定义的类型表达式是引用类型的语法。它可以引用
- 推断类型,它要求编译器确定类型。
- 括号,用于消除歧义。
- 特征类型:特征对象和 impl trait。
- never 类型。
- 宏,它展开为类型表达式。
带括号的类型
ParenthesizedType :
(
Type)
在某些情况下,类型的组合可能存在歧义。在类型周围使用括号以避免歧义。例如,类型边界内引用类型的 +
运算符不清楚边界适用于何处,因此需要使用括号。需要这种消除歧义的语法规则使用 TypeNoBounds 规则而不是 Type。
#![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)))); }