附錄 B:運算子與符號

此附錄包含 Rust 語法的詞彙表,包含運算子以及其他符號,這些符號會單獨出現或出現在路徑、泛型、特徵界限、巨集、屬性、註解、元組與大括號中。

運算子

表 B-1 包含 Rust 中的運算子、運算子如何出現的範例、簡單解釋以及該運算子是否能超載(overloadable)。如果一個運算子可以超載,用來超載該運算子對應的特徵會列出來。

表 B-1:運算子

運算子範例解釋能否超載?
!ident!(...), ident!{...}, ident![...]巨集表達式
!!expr位元運算(Bitwise)或邏輯運算補數(logical complement)Not
!=var != expr不相等比較PartialEq
%expr % expr算數餘數Rem
%=var %= expr算數餘數並賦值RemAssign
&&expr, &mut expr借用
&&type, &mut type, &'a type, &'a mut type借用指標型別
&expr & expr位元運算 ANDBitAnd
&=var &= expr位元運算 AND 並賦值BitAndAssign
&&expr && expr邏輯運算 AND
*expr * expr算數乘法Mul
*=var *= expr算數乘法並賦值MulAssign
**expr解引用
**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右排除範圍
..=..=expr, expr..=expr右包含範圍
....expr結構體更新語法
..variant(x, ..), struct_type { x, .. }「與剩餘部分」模式綁定
...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賦值/等值
==expr == expr等於比較PartialEq
=>pat => expr配對分支語法的其中一部分
>expr > expr大於比較PartialOrd
>=expr >= expr大於等於比較PartialOrd
>>expr >> expr右移Shr
>>=var >>= expr右移並賦值ShrAssign
@ident @ pat模式綁定
^expr ^ expr位元運算互斥(exclusive)ORBitXor
^=var ^= expr位元運算互斥 OR 並賦值BitXorAssign
|pat | pat模式 OR
|expr | expr位元運算 ORBitOr
|=var |= expr位元運算 OR 並賦值BitOrAssign
||expr || expr邏輯運算 OR
?expr?錯誤傳遞

非運算子符號

以下列表包含所有不作為運算子的非字母符號;也就是說,它們的行為並不像是在呼叫函式或方法。

表 B-2 顯示了出現在各處單獨出現且有效的符號。

表 B-2:獨立語法

符號解釋
'ident有名稱的生命週期或迴圈標籤
...u8, ...i32, ...f64, ...usize, etc.指定型別的數值字面值
"..."字串字面值
r"...", r#"..."#, r##"..."##, etc.原始字串字面值,不會處理跳脫字元
b"..."位元組字串字面值,其會組織一個 [u8] 而非字串
br"...", br#"..."#, br##"..."##, etc.原始位元組字串字面值,結合原始與位元組字串的字面值
'...'字元字面值
b'...'ASCII 位元組字面值
|...| expr閉包
!發散函式(diverging functions)的永遠為空的型別
_「忽略」模式綁定,也用於整數字面值的可讀性

表 B-3 顯示了出現在模組架構中到一個項目的路徑的符號。

表 B-3:路徑相關語法

符號解釋
ident::ident命名空間路徑
::path與 crate 源頭相對應的路徑(如顯式絕對路徑)
self::path與目前模組相對應的路徑(如顯式相對路徑)
super::path與上層模組相對應的路徑
type::ident, <type as trait>::ident關聯常數、函式與型別
<type>::...無法直接命名的型別的關聯項目(如 <&T>::...<[T]>::... 等等)
trait::method(...)透過命名其定義的特徵來消除方法呼叫的歧義
type::method(...)透過命名其定義的型別來消除方法呼叫的歧義
<type as trait>::method(...)透過命名特徵與型別來消除方法呼叫的歧義

Table B-4 顯示出現在泛型型別參數的符號。

表 B-4:泛型

型別解釋
path<...>指定參數給型別中的泛型型別(如 Vec<u8>
path::<...>, method::<...>指定參數給表達式中的泛型型別、函式或方法,通常被稱之為 turbofish(如 "42".parse::<i32>()
fn ident<...> ...定義泛型函式
struct ident<...> ...定義泛型結構體
enum ident<...> ...定義枚舉結構體
impl<...> ...定義泛型實作
for<...> type高階生命週期界限
type<ident=type>其一或數個關聯型別有特定賦值的泛型型別(如 Iterator<Item=T>

表 B-5 顯式出現在透過特徵界限約束泛型型別參數的符號。

表 B-5:特徵界限約束

符號解釋
T: U泛型參數 T 約束於實作 U 的型別
T: 'a泛型參數 T 的生命週期必須比 'a 還長(代表該型別無法傳遞包含任何聲明週期短於 'a 的因引用)
T : 'static泛型型別 T 不包含 'static 以外的借用引用
'b: 'a泛型生命週期 'b 必須長於 'a
T: ?Sized允許泛型型別參數為動態大小型別
'a + trait, trait + trait複合型別約束

表 B-6 顯示出現在呼叫或定義巨集與指定項目屬性的符號。

表 B-6:巨集與屬性

符號解釋
#[meta]外部屬性
#![meta]內部屬性
$ident巨集替代
$ident:kind巨集捕獲
$(…)…巨集重複
ident!(...), ident!{...}, ident![...]巨集調用

表 B-7 顯示建立註解的符號。

表 B-7:註解

符號解釋
//行註解
//!內部行技術文件註解
///外部行技術文件註解
/*...*/區塊註解
/*!...*/內部區塊技術文件註解
/**...*/外部區塊技術文件註解

表 B-8 顯示出現在元組中的符號。

表 B-8:元組

符號解釋
()空元組(也稱為單元),同時是字面值與型別
(expr)括號表達式
(expr,)單一元素元組表達式
(type,)單一元素元組型別
(expr, ...)元組表達式
(type, ...)元組型別
expr(expr, ...)函式呼叫表達式,也用來初始化元組 struct 與元組 enum 變體
expr.0, expr.1, etc.元組索引

表 B-9 顯在大括號使用到的地方。

表 B-9:大括號

符號解釋
{...}區塊表達式
Type {...}struct 字面值

表 B-10 顯示中括號使用到的地方。

表 B-10:中括號

符號解釋
[...]陣列字面值
[expr; len]包含 lenexpr 的陣列字面值
[type; len]包含 lentype 的陣列字面值
expr[expr]集合索引,可超載(IndexIndexMut
expr[..], expr[a..], expr[..b], expr[a..b]使用 RangeRangeFromRangeToRangeFull 作為「索引」來替代集合 slice 的集合索引