术语表
抽象语法树
"抽象语法树" (AST) 是编译器在编译时,表示程序结构的一种中间形式。
对齐
值的对齐以值的首个地址指定。该值始终是 2 的幂次方。值的引用必须对齐。 更多。
元数
元数是指函数或操作符接受的操作数的数量。例如, f(2, 3)
和 g(4, 6)
的元数为 2 ,而 h(8, 2, 6)
的元数为 3 。!
运算符的元数为 1 。
数组
数组有时也称为固定大小数组或内联数组,该值描述了由多个元素组成的集合,每个元素在程序运行时可由索引选择。 数组占用了一段连续的内存区域。
关联条目
关联条目指与另一个条目相关联的条目。关联条目在 实现 中定义,可在 traits 中声明。 只有函数、常量和类型别名可以是关联的。相对的是 自由条目 。
覆盖实现
类型实现包含 未覆盖 的类型是泛型实现。
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 的限制。例如,如果对函数的参数加了约束,则传递给该函数的类型必须遵守该约束。
组合
组合是只应用函数和之前定义的组合,并以从其参数提供结果的高阶函数。组合以模块化的方式管理控制流。
Crate
Crate (箱体) 是编译和链接的基本单位。有库或可执行等不同的类型。 Crate 可以链接和引用 '外部 Crate' 。 Crate 具有内部的模块树,顶层是一个匿名模块,称为 Crate 根。 在 Crate 根中将条目标记为公开的,可使这些条目对其他 Crate 可见。 请参考 Rust文档 以了解更多信息。
调度
调度是在涉及多态性时确定实际运行的特定代码版本的机制。 静态调度和动态调度是两种主要的调度形式。 虽然 Rust 更侧重静态调度,但也通过称为 "特征对象" 的机制支持动态调度。
动态大小类型
动态大小类型 (DST) 是一种没有静态已知大小或对齐的类型。
实体
实体 是一种语言结构,在源程序中可以通过某种方式进行引用,通常是通过 路径 。 实体包括 类型 、条目 、泛型参数 、 变量绑定 、 循环标签 、 生命周期 、 字段、 属性 和 代码分析 。
表达式
表达式是值、常量、变量、运算符和函数的组合,可以求值为单个值,可以具有或不具有副作用。
例如,2 + (3 * 4)
是一个值为 14 的表达式。
自由条目
指的是不属于 实现 的 条目 ,例如 自由函数 或 自由常量 。与 关联条目 相对。
基本 trait
基本 trait 是指为现有类型添加一个 impl 会导致代码不兼容的 trait 。 Fn
trait 和 Sized
trait 是基本 trait 。
基本类型构造器
基本类型构造器是指实现 泛型实现 会破坏其结构的类型。 &
、 &mut
、 Box
和 Pin
是基本类型构造器。
任何时候,只要类型 T
被视为 局部类型, &T
、 &mut T
、 Box<T>
和 Pin<T>
也会被视为局部类型。基本类型构造器不能覆盖其他类型。每当使用术语 "覆盖类型" 时, &T
、 &mut T
、 Box<T>
和 Pin<T>
中的 T
不被视为覆盖的类型。
有实例
如果一个类型具有构造函数并且因此可以被实例化,则称其为 "有实例" 。有实例的类型不是 "空的" ,因为它可以有值。与 无实例 相对。
内部实现
适用于具名类型而不是 trait-类型对的 实现 。 更多 。
内部方法
在内部实现中定义的方法,而不是在 trait 实现中定义的方法。
初始化
如果变量被赋值且未被移动,那么表示被初始化了。对应的其他内存位置被认为是未初始化的。只有使用非安全 Rust 才能创建未初始化的内存位置。
局部 trait
在当前 crate 中定义的 trait
。一个 trait 定义是否局部与应用的类型参数无关。
例如对于 trait Foo<T, U>
,不管 T
和 U
被替换为哪些类型, Foo
都是局部的。
局部类型
在当前 crate 中定义的 struct
、 enum
或 union
类型。应用的类型参数不会影响此定义。
例如, struct Foo
被认为是局部类型,但 Vec<Foo>
不是。LocalType<ForeignType>
也是局部类型。类型别名不影响类型的局部性。
模块
模块是容纳零个或多个 条目 的容器。模块被组织成一棵树,从一个匿名根模块开始,称为 crate 根或根模块。 可以使用 路径 引用其他模块中的条目,这些引用可能受 可见性规则 的限制。 参阅模块
名称
名称 是指引用一个 实体 的 标识符 或 生命周期或循环标签 。 当一个实体声明引入与该实体相关联的标识符或标签时,称之为 名称绑定 。可以使用 路径 、标识符和标签来引用实体。
名称解析
名称解析 是将 路径 、 标识符 和 标签 与 实体 声明绑定的编译时过程。
命名空间
命名空间 是基于名称所引用的 实体 的种类而声明的名称的逻辑分组。 命名空间允许一个命名空间中的名称与另一个命名空间中有相同的名称而不冲突。
在命名空间内,名称按层级组织,每个层级都有自己的命名实体集合。
具名类型
可直接通过路径引用的类型。具体而言,包括 枚举 、 结构体 、 联合体 和 trait 对象 。
对象安全trait
可以用作 trait 对象 的 Traits 。只有符合特定 规则 的 Trait 才是对象安全的。
路径
Path 是一个由一个或多个路径段组成的序列,用于引用当前作用域或其他层级的 命名空间 中的 实体 。
预导入
预导入或称为 Rust 预导入,是条目的集合,主要用于将 Trait 导入到 crate 的每个模块中。 预导入库中的 Trait 在任意位置可用。
作用域
作用域 是源代码文本中的一个区域,在此区域内的命名实体 entity 可以使用其名称引用。
被匹配项
被匹配项是在 match
表达式和类似的模式匹配结构中被匹配的表达式。例如,在 match x { A => 1, B => 2 }
中,表达式 x
是被匹配项。
值大小
一个值的大小有两个定义:
第一个定义是该值所需的内存占用。
第二个定义具有该类型的数组中,相邻元素之间的偏移量 (以字节为单位) 。
其大小是对齐的倍数,包括零。大小可以根据编译器版本 (随着新的优化) 和目标平台而变化 (类似于usize
因平台而异) 。
请参考 Rust文档 以了解更多信息。
切片
切片是对连续序列的动态大小的 '视图' ,写作 [T]
。
通常以其借用形式出现,可以是可变的或共享的。
共享切片类型是 &[T]
,而可变切片类型是 &mut [T]
,其中 T
表示元素类型。
语句
语句是编程语言中最小的独立元素,它命令计算机执行操作。
字符串字面值
字符串字面值是直接存储在最终二进制文件中的字符串,因此在 'static
时间中总是有效的。
类型是 'static
时间借用的字符串切片, &'static str
。
字符串切片
字符串切片是 Rust 中最原始的字符串类型,写作 str
。通常以其借用形式出现,可以是可变的或共享的。
共享字符串切片类型是 &str
,而可变字符串切片类型是 &mut str
。
字符串切片始终是有效的 UTF-8。
Trait
[Trait] 是一种语言条目,用于描述类型必须提供的功能。允许类型对其行为做出某些承诺。
泛型函数和泛型结构可以使用 trait 来约束或限制其允许接受的类型。
鱼形符号
在表达式中具有通用参数的路径必须在开括号前加上 ::
。与通用角括号结合使用,看起来像鱼形符号 ::<>
。因此,这种语法俗称为鱼形语法。
例如:
#![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 { }
。与 驻留 相对。