Rust 勸退系列 06:常量

大家好,我是站長 polarisxu。

這是 Rust 勸退系列的第 6 個教程,探討 Rust 中的常量,因爲 static 和常量有類似之處,因此一併探討。(Rust By Example 中甚至將常量分成兩種類型:const 和 static,我個人覺得常量是常量,static 修飾的是變量,不能算是常量)

01 常量

在 Rust 語言中,術語 "常量" 用於表示固定的值,比如 5 、-89、 I love Rust、3.14 等等。一旦我們定義了一個常量,那麼就再也不能改變常量的值了。

Rust 語言中使用 const 關鍵字來定義一個常量。定義常量時需要明確指定常量的數據類型。

看看下面的代碼:(&str 類型以後講解)

const NUM: i32 = 5;  // const NUM = 5i8 編譯不通過
const PI: f64 = 3.14;
const LOVE: &str = "I love Rust!"; // 也可以使用: &'static str,即指定聲明週期

在變量那一節講過字面量。常量要求賦值時只能是常量表達式(字面量是常量表達式一種),這一點大部分語言都類似,即要求是編譯期能計算出值的。

關於常量,需要注意以下幾點:

02 靜態變量

這部分內容,我建議你看完就忘掉它!!!

Rust 中,靜態變量也叫全局變量。一般不建議使用。通過 static 定義靜態變量。(Go 中沒有 static 關鍵字)

示例:

static NUM: i32 = 100;

之所以將它和常量放在一起講,是因爲和常量有一些相似之處:

但和常量也有一些重要的區別:

也正是因爲全局變量有可變特性,導致多個線程同時訪問時,可能引發數據競爭,導致內存安全問題。因此,對於全局可變變量的訪問和修改必須放在 unsafe 塊中進行。以下代碼編譯不通過:

static mut NUM: i32 = 10;

fn main() {
    NUM += 1;
    println!("{}", NUM);
}

編譯器提示:

error[E0133]: use of mutable static is unsafe and requires unsafe function or block

改爲這樣就可以了:

static mut NUM: i32 = 10;

fn main() {
    unsafe {
        NUM += 1;
        println!("{}", NUM);
    }
}

unsafe,Go 程序員應該很熟悉。在 Go 中一般也建議別用它。

如果不用 unsafe,也就是靜態變量別定義爲可變,那這和常量似乎沒啥區別,直接使用 const 更好。

03 小結

Rust 中的常量沒有太多特殊的地方,但靜態變量,我建議忘記它的存在。可能有極端的場景,通過靜態變量能帶來一些好處,但應該不是必須的。Rust 本身就夠複雜的了,能學簡單點就簡單點。因此,我建議你可以忘掉關於 static 的內容。


上次有朋友截了個圖,發現這個系列閱讀量階梯型下跌:

如果你都看到這裏了,說明你還在堅持學習 Rust,隨手給我來個三連吧:在看、點贊、轉發,讓我有堅持寫下去的動力~

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/y5WJbP8qcvdm4WASXEEibQ