类型
Rust 程序中的每个变量、项和值都具有类型。*值*的*类型*定义了存储该值的内存的解释方式以及可以对该值执行的操作。
内置类型与语言紧密集成,以非平凡的方式工作,这在使用户定义类型中无法模拟。
用户定义类型的能力有限。
类型列表如下
- 基本类型
- 序列类型
- 用户定义类型
- 函数类型
- 指针类型
- Trait 类型
类型表达式
语法
Type :
TypeNoBounds
| ImplTraitType
| TraitObjectTypeTypeNoBounds :
ParenthesizedType
| ImplTraitTypeOneBound
| TraitObjectTypeOneBound
| TypePath
| TupleType
| NeverType
| RawPointerType
| ReferenceType
| ArrayType
| SliceType
| InferredType
| QualifiedPathInType
| BareFunctionType
| MacroInvocation
如上方 *Type* 语法规则所定义的,*类型表达式*是引用类型的语法。它可以引用
- 推断类型,要求编译器确定类型。
- 圆括号,用于消除歧义。
- Trait 类型:Trait 对象 和 impl trait。
- 永不类型。
- 宏,其展开为一个类型表达式。
圆括号类型
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)))); }