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