附录 B:运算符与符号

此附录包含了 Rust 语法的词汇表,包括运算符及别的一些,自己单独出现或出现于路径、泛型、特质边界、宏、属性、注释、元组及方括符等上下文中的符号。

运算符

Operators

表 B-1 包含了 Rust 中的符号、该符号将如何出现于上下文中的一个示例、简单的解释,以及该运算符是否可过载。若某个运算符可以过载,就会列出过载那个运算符要用到的相关特质。

表 B-1:运算符

运算符示例说明是否可以过载
!ident! (...)
ident! {...}
ident! [...]
宏扩展
!!expr按位或逻辑求补运算
!=expr != expr不等比较PartialEq
%expr % expr算术求余运算Rem
%=var %= expr算术求余并赋值RemAssign
&&expr, &mut expr借用
&&type, &mut type, &'a type, &'a mut type借用指针类型
&expr & expr按位与(AND)运算BitAnd
&=var &= expr按位与(AND)运算并赋值BitAndAssign
&&expr && expr短路逻辑与(AND)运算,short-circuit logical AND
*expr * expr算术乘法运算Mul
*=var *= expr算术乘法运算并赋值MulAssign
**expr解引用运算Deref
**const type, *mut type原始指针运算
+trait + trait, 'a + trait复合类型约束运算
+expr + expr算术加法运算Add
+=var += expr算术加法运算并赋值AddAssign
,expr, expr参数与元素分隔符
-- expr算术取反运算Neg
-expr - expr算术减法运算Sub
-=var -= expr算术减法运算并赋值SubAssign
->fn(...) -> type, |...| -> type函数与闭包的返回值类型
.expr.ident成员访问
...., expr.., ..expr, expr..expr排除右侧的范围语法字面值PartialOrd
..=..=expr, expr..=expr包含右侧范围语法字面值PartialOrd
....expr结构体更新语法
..variant(x, ..), struct_type { x, .. }“等等” 模式绑定,"And the rest" pattern binding
...expr...expr(已弃用,请使用 ..= 代替)在模式中:包含式范围模式
/expr / expr算术除法运算Div
/=var /= expr算术除法并赋值DivAssign
:pat: type, ident: type约束
:ident: expr结构体字段初始化
:'a: loop {...}循环标签
;expr;语句及项目的终止符
;[..., len]固定大小数组语法的一部分
<<expr << expr向左移位运算Shl
<<=var <<= expr向左移位运算并赋值ShlAssign
<expr < expr小于比较PartialOrd
<=expr <= expr小于等于比较PartialOrd
=var = expr, ident = type赋值/等价,equivalence
==expr == expr相等比较PartialEq
=>pat => expr匹配支臂语法的一部分
>expr > expr大于比较PartialOrd
>=expr >= expr大于等于比较PartialOrd
>>expr >> expr向右位移运算Shr
>>=var >>= expr向右位移运算并赋值ShrAssign
@ident @ pat模式绑定
^var ^ expr按位异或运算BitXor
^=var ^= expr按位异或运算并赋值BitXorAssign
|pat | pat模式选择,pattern alternatives
|expr | expr按位或(OR)运算BitOr
|=var |= expr按位或(OR)运算并赋值BitOrAssign
||expr || expr短路逻辑或运算,Short-circuiting logical OR
?expr?错误传递

非运算符的符号

Non-operator Symbols

以下清单包含了不以运算符发挥作用的全部符号;那就是说,他们不会表现得像函数或方法调用。

表 B-2 给出了自己单独出现,并在多种场合有效的一些符号。

表 B-2:独立语法,Stand-Alone Syntax

符号说明
'ident命名的生命周期或循环标签
...u8, ...i32, ...f64, ...usize 等等指定类型的数字字面值
"..."字符串字面值
r"...", r#"..."#, r##"..."## 等等原始字符串字面值,其中的转义字符不会被处理
b"..."字节字符串字面值;构造出一个字节数组而非字符串
br"...", br#"...", br##"..."## 等等原始字节字符串字面值,是原始与字节字符串字面值的结合
'...'字符字面值
b'...'ASCII 字节字面值
|...| expr闭包
!发散函数下总是空的底部类型,always empty bottom type for diverging functions
_“忽略,ignored” 模式绑定;还用于令到整数字面值可读,also used to make integer literals readable

表 B-3 展示了出现在模组层次结构中到某个项目路径上下文中的一些符号。

表 B-3:路径相关的语法

符号说明
ident::ident命名空间路径
::path相对于代码箱根的路径(比如,某个显式绝对路径)
self::path相对于当前模组的路径(比如,某个显式相对路径)
super::path相对于当前模组父模组的路径
type::ident, <type as trait>::ident关联的常量、函数及类型
<type>::...无法直接命名的某个类型的关联项目(比如,<&T>::..., <[T]>::... 等等)
trait::method(...)通过命名出定义方法的类型,消除该方法调用的歧义
<type as trait>::method(...)通过命名出特质与类型,消除方法调用的歧义

表 B-4 展示了出现在运用泛型参数上下文中的一些符号。

表 B-4:泛型

符号说明
path<...>指明类型中的泛型参数(比如,Vec<u8>
path::<...>, method::<...>指明表达式中泛型、函数或方法的参数;通常这被称作涡轮鱼语法,turbofish(比如,"42".parse::<i32>(),关于 Rust 的 turbofish 语法,请参考:What is Rust's turbofish),RUST 中的 turbofish 语法(一) ...
fn ident<...> ...定义出泛型函数
struct ident<...> ...定义出泛型结构体
enum ident<...> ...定义出泛型枚举
impl<...> ...定义出泛型实现
for<...> type高阶声明周期边界,higher-ranked lifetime bounds
type<ident=type>其中一个或更多的关联类型有着指定赋值的某种泛型(a generic type where one or more associated types have specific assignments,比如,Iterator<Item=T>

下表 B-5 展示了出现在使用特质边界的约束性泛型参数上下文中的一些符号,table B-5 shows symbols that appear in the context of constraining generic type parameters with trait bounds。

B-5:特质边界约束,Trait Bound Constrains

符号说明
T: U泛型参数 T 受实现了 U 的类型约束
T: 'a泛型 T 必须要比生命周期 'a 活得更久,generic type T must outlive lifetime 'a(意思是该类型不能间接地包含任何生命周期短于 'a 的引用)
T: 'static泛型 T 不包含除 'static 的引用外的其他引用
'b: 'a泛型生命周期 'b 必须要比 'a 存活得更久
T: ?Sized允许泛型参数为动态大小类型
'a + trait, trait + trait复合的类型约束

下表 B-6 展示了出现在宏调用或定义上下文中,并指明了某个项目上属性的一些符号。

B-6:宏与属性

符号说明
#[meta]外层属性
#![meta]内层熟悉
$ident宏代换,macro substitution
$ident:kind宏捕获
$(...) ...宏重复,macro repetition
ident! (...), ident! {...}, ident! [...]宏调用,macro invocation

下表 B-7 展示了创建注释的一些符号。

表 B-7:注释

符号说明
//注释行
//!内层行文档注释,inner line doc comment
///外层行文档注释,outter line doc comment
/*...*/注释块
/*!...*/内层块文档注释,inner block doc comment
/**...*/外层块文档注释,outter block doc comment

下表 B-8 展示了出现于用到元组上下文中的一些符号。

元组

符号说明
()空元组(又叫单元值),同时属于字面值与类型
(expr)元括号括起来的表达式,parenthesized expression
(expr,)单一元素的元组表达式
(type,)单一元素的元组类型,single-element tuple type
(expr, ...)元组表达式
(type, ...)元组类型,tuple type
expr(expr, ...)函数调用表达式;还用于初始化一些元组的 struct 以及元组的 enum 变种,function call expression; also used to initialize tuple structs and tuple enum vairants
expr.0, expr.1 等等对元组进行索引

下表 B-9 展示了其中用到花括号上下文中的一些符号。

表 B-9:花括号

符号说明
{...}代码块表达式
Type {...}struct 的字面值

下表 B-10 展示了其中用到方括号上下文中的一些符号。

表 B-10:方括号

符号说明
[...]数组的字面值
[expr; len]包含着 exprlen 拷贝数组的字面值
[type; len]包含着 lentype 的实例数组的字面值
expr[expr]对集合进行索引,collection indexing。是可过载的 (Index, IndexMut),overloadable (Index, IndexMut)
expr[..], expr[a..], expr[..b], expr[a..b]用到了 RangeRangeFromRangeToRangeFull 作为 “索引”的,带有集合切片集合索引,collection indexing pretending to be collection slicing, using Range, RangeFrom, RangeTo, or RangeFull as the "index"
Last change: 2023-12-01, commit: aa11f3e