类型

在 Rust 程序中,每个变量、条目和值都有一个类型。类型定义了用于保存它的内存的解释以及可以对该值执行的操作。

内建类型紧密集成到语言中,其重要程度是用户自定义类型无法模拟的。

用户自定义类型具有有限的功能。

类型列表如下:

类型表达式

语法
类型 :
      TypeNoBounds
   | ImplTraitType
   | TraitObjectType

TypeNoBounds :
      ParenthesizedType
   | ImplTraitTypeOneBound
   | TraitObjectTypeOneBound
   | TypePath
   | TupleType
   | NeverType
   | RawPointerType
   | ReferenceType
   | ArrayType
   | SliceType
   | InferredType
   | QualifiedPathInType
   | BareFunctionType
   | MacroInvocation

如上面的类型语法规则中定义的类型表达式是引用类型的语法。它可以引用

  • 括号,用于消除歧义。
  • ,它展开为类型表达式。

带括号的类型

ParenthesizedType :
   ( Type )

在某些情况下,类型的组合可能存在歧义。在类型周围使用括号以避免歧义。例如,类型边界引用类型+ 运算符不清楚边界适用于何处,因此需要使用括号。需要这种消除歧义的语法规则使用 TypeNoBounds 规则而不是 Type

#![allow(unused)]
fn main() {
use std::any::Any;
type T<'a> = &'a (dyn Any + Send);
}

递归类型

名义类型 — 结构体枚举联合体 — 可以是递归的。也就是说,每个 enum 变体或 structunion 字段可以直接或间接地引用封闭的 enumstruct 类型本身。

这种递归有约束

  • 递归类型必须在递归中包含名义类型(不仅仅是类型别名,或其他结构类型,例如 数组元组)。因此,不允许使用 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))));
}