类型

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

内置类型与语言紧密集成,其方式非常重要,用户定义的类型无法模拟。

类型列表如下

类型表达式

语法

类型 :

      无边界类型

   | ImplTraitType

   | TraitObjectType

无边界类型 :

      带括号的类型

   | ImplTraitTypeOneBound

   | TraitObjectTypeOneBound

   | 类型路径

   | 元组类型

   | NeverType

   | 原始指针类型

   | 引用类型

   | 数组类型

   | 切片类型

   | 推断类型

   | 类型中的限定路径

   | 裸函数类型

   | 宏调用

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

带括号的类型

带括号的类型 :

   ( 类型 )

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

#![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))));
}