类型
在 Rust 程序中,每个变量、条目和值都有一个类型。 一个 值 的 类型 定义了其存储在内存中的解释方式,以及该值可执行的相关操作。
内置类型与语言编译器紧密集成,实现方式与用户定义类型有所不同。 用户定义类型受到语法规则的限制,因而具有有限的功能。
Rust 类型包括:
- 原始类型:
- 序列类型:
- 用户定义类型:
- 函数类型:
- 指针类型:
- Trait 类型:
类型表达式
语法
类型 :
无约束类型组
| ImplTrait类型
| Trait对象类型无约束类型组 :
括号类型
| ImplTrait类型单约束
| Trait对象类型单约束
| 类型路径
| 元组类型
| 永不类型
| 原始指针类型
| 引用类型
| 数组类型
| 切片类型
| 推断类型
| 限定路径类型
| 裸函数类型
| 宏调用
在上面的 类型 语法规则中所定义的 类型表达式 描述的类型语法,可对应包含以下类型:
- 序列类型 ( 元组 数组 切片 ) 。
- 类型路径 可以引用:
- 指针类型 ( 引用 原始指针 函数指针 ) 。
- 推断类型 ,请求编译器确定类型。
- 用于消除歧义的 括号 。
- Trait 类型: Trait 对象 和 impl trait 。
- 永不类型 类型。
- 宏 ,可展开为类型表达式。
译注: rust 中相关语法和概念有很好的统一性,这里将类型归并到表达式概念下就是很好的体现。 这里要理解的一点是,之所以将类型归并到表达式,是强调了类型同样存在的求值机制, 即多个类型组合后的表达式会求值为一个更为复杂的类型结构,而通过这一类型去约束其他类型和值。
括号类型
括号类型 :
(
类型)
有时,类型组合可能不明确,需要添加括号以区分。
例如, 引用类型 中 类型约束 的 +
运算符对应的类型边界容易歧义,则需要使用括号。
这个消除歧义的语法使用 无约束类型组 语法规则,而不是 类型 。
#![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)))); }