术语表
抽象语法树
“抽象语法树”(AST)是编译器在编译程序时程序结构的中间表示。
对齐
值的“对齐”指定了值首选的起始地址。始终是 2 的幂。对值的引用必须对齐。更多。
元数
“元数”是指函数或运算符接受的参数数量。例如,f(2, 3)
和 g(4, 6)
的元数为 2,而 h(8, 2, 6)
的元数为 3。!
运算符的元数为 1。
数组
“数组”,有时也称为“固定大小数组”或“内联数组”,是一个描述元素集合的值,每个元素都由一个索引选择,该索引可以在运行时由程序计算。它占用一块连续的内存区域。
关联项
“关联项”是与另一个项关联的项。关联项在实现中定义,并在特征中声明。只有函数、常量和类型别名可以关联。与自由项形成对比。
全覆盖实现
任何类型出现未覆盖的实现。impl<T> Foo for T
、impl<T> Bar<T> for T
、impl<T> Bar<Vec<T>> for T
和 impl<T> Bar<T> for Vec<T>
都被认为是全覆盖实现。但是,impl<T> Bar<Vec<T>> for Vec<T>
不是全覆盖实现,因为此 impl
中出现的所有 T
实例都被 Vec
覆盖。
边界
“边界”是对类型或特征的约束。例如,如果对函数接受的参数设置了边界,则传递给该函数的类型必须遵守该约束。
组合子
“组合子”是仅应用函数和先前定义的组合子来从其参数提供结果的高阶函数。它们可以用于以模块化方式管理控制流。
包
“包”是编译和链接的单元。有不同类型的包,例如库或可执行文件。包可以链接和引用其他库包,称为“外部包”。一个包有一个自包含的模块树,从一个名为“包根”的未命名根模块开始。可以通过将项标记为包根中的公共项来使其他包可见,包括通过公共模块的路径。更多。
分派
“分派”是在涉及多态性时确定实际运行哪个特定代码版本的机制。两种主要的分派形式是静态分派和动态分派。虽然 Rust 倾向于静态分派,但它也通过一种称为“特征对象”的机制支持动态分派。
动态大小类型
“动态大小类型”(DST)是没有静态已知大小或对齐的类型。
实体
实体是一种语言结构,可以在源程序中以某种方式引用,通常是通过路径。实体包括类型、项、泛型参数、变量绑定、循环标签、生命周期、字段、属性和lint。
表达式
“表达式”是值、常量、变量、运算符和函数的组合,它们求值为单个值,无论是否具有副作用。
例如,2 + (3 * 4)
是一个返回 14 的表达式。
自由项
一个不属于实现的项,例如自由函数或自由常量。与关联项形成对比。
基础特征
基础特征是指为现有类型添加其实现将导致破坏性变更的特征。Fn
特征和 Sized
是基础特征。
基础类型构造器
基础类型构造器是指对其进行全覆盖实现将导致破坏性变更的类型。&
、&mut
、Box
和 Pin
都是基础类型构造器。
每当类型 T
被视为本地类型时,&T
、&mut T
、Box<T>
和 Pin<T>
也被视为本地类型。基础类型构造器不能覆盖其他类型。每当使用术语“被覆盖类型”时,&T
、&mut T
、Box<T>
和 Pin<T>
中的 T
不被视为被覆盖类型。
可实例化
如果一个类型具有构造函数,因此可以实例化,则该类型是可实例化的。可实例化类型不是指该类型可以有值的意义上的“非空”。与不可实例化相反。
固有实现
固有方法
已初始化
如果一个变量已被赋值并且之后没有被移走,则该变量已初始化。所有其他内存位置都被假定为未初始化。只有不安全的 Rust 代码才能创建未初始化的内存位置。
本地特征
在当前 crate 中定义的 trait
。特征定义是否是本地的与应用的类型参数无关。给定 trait Foo<T, U>
,无论为 T
和 U
替换什么类型,Foo
始终是本地的。
本地类型
在当前 crate 中定义的 struct
、enum
或 union
。这不受应用的类型参数的影响。struct Foo
被视为本地类型,但 Vec<Foo>
不是。LocalType<ForeignType>
是本地类型。类型别名不影响本地性。
模块
模块是零个或多个项的容器。模块以树形结构组织,从根目录下的一个未命名模块开始,称为 crate 根模块或根模块。路径可用于引用其他模块中的项,这可能会受到可见性规则的限制。更多
名称
名称是一个标识符或生命周期或循环标签,用于引用实体。名称绑定是指实体声明引入与该实体关联的标识符或标签时。路径、标识符和标签用于引用实体。
名称解析
命名空间
命名空间是根据名称所引用的实体的类型对已声明名称进行逻辑分组。命名空间允许一个命名空间中出现的名称不会与另一个命名空间中的相同名称冲突。
在命名空间内,名称按层次结构组织,层次结构的每一层都有自己的命名实体集合。
名义类型
可以直接通过路径引用的类型。具体来说是枚举、结构体、联合体和特征对象。
对象安全特征
可以用作特征对象的特征。只有遵循特定规则的特征才是对象安全的。
路径
路径是一个或多个路径段的序列,用于引用当前作用域或命名空间层次结构其他级别中的实体。
前奏
前奏,或称 Rust 前奏,是一小组项(主要是特征),它们被导入到每个 crate 的每个模块中。前奏中的特征是普遍存在的。
作用域
被匹配表达式
被匹配表达式是在 match
表达式和类似的模式匹配结构中进行匹配的表达式。例如,在 match x { A => 1, B => 2 }
中,表达式 x
是被匹配表达式。
大小
值的大小有两个定义。
第一个定义是存储该值必须分配多少内存。
第二个定义是具有该项类型的数组中连续元素之间的字节偏移量。
它是对齐的倍数,包括零。大小可能会根据编译器版本(随着新优化的进行)和目标平台(类似于 usize
如何因平台而异)而变化。
更多.
切片
切片是对连续序列的动态大小视图,写成 [T]
。
它经常以其借用形式出现,可以是可变的,也可以是共享的。共享切片类型是 &[T]
,而可变切片类型是 &mut [T]
,其中 T
表示元素类型。
语句
语句是编程语言中最小的独立元素,它命令计算机执行一个动作。
字符串字面量
字符串字面量是直接存储在最终二进制文件中的字符串,因此对于 'static
生命周期是有效的。
它的类型是 'static
生命周期借用字符串切片,&'static str
。
字符串切片
字符串切片是 Rust 中最原始的字符串类型,写成 str
。它经常以其借用形式出现,可以是可变的,也可以是共享的。共享字符串切片类型是 &str
,而可变字符串切片类型是 &mut str
。
字符串切片始终是有效的 UTF-8。
特征
特征是一种语言项,用于描述类型必须提供的功能。它允许类型对其行为做出某些承诺。
泛型函数和泛型结构体可以使用特征来约束或绑定它们接受的类型。
涡轮鱼
表达式中带有泛型参数的路径必须在左括号前加上 ::
。结合泛型的尖括号,这看起来像一条鱼 ::<>
。因此,这种语法被俗称为涡轮鱼语法。
示例
#![allow(unused)] fn main() { let ok_num = Ok::<_, ()>(5); let vec = [1, 2, 3].iter().map(|n| n * 2).collect::<Vec<_>>(); }
这个 ::
前缀是必需的,以便消除逗号分隔列表中具有多个比较的泛型路径的歧义。有关没有前缀会导致歧义的示例,请参见涡轮鱼的堡垒。
未覆盖类型
未作为参数出现在其他类型中的类型。例如,T
是未覆盖的,但 Vec<T>
中的 T
是被覆盖的。这仅与类型参数相关。
未定义行为
未指定的编译时或运行时行为。这可能导致(但不限于):进程终止或损坏;不正确、错误或意外的计算;或特定于平台的结果。更多。
不可实例化
如果一个类型没有构造函数,因此永远不能实例化,则该类型是不可实例化的。不可实例化类型是指该类型没有值的意义上的“空”。不可实例化类型的典型例子是永不类型 !
,或者没有变体的枚举 enum Never { }
。与可实例化相反。