【Rust筆記】static- const- let 聲明變量有什麼區別?
就【求值 - 時間點】來講,
-
static與const都是【編譯時】求值 -
let是【編譯時】綁定,求值時間點取決於賦值語句右側值的類型 -
【常量表達式】編譯時求值
-
【普通表達式】運行時求值
就【賦值】來講,
-
static與const僅只接受【常量表達式】。 -
const不能引用一個static,但可引用另一個const。 -
let既可以接受【常量表達式】,也能夠接受運行時求值的普通表達式。
就【內存管理】來講,
-
const- 其自身不佔用任何內存空間。相反,常量值會被直接【內聯】入它被使用的(若干)位置。 -
static- 其全局單實例會被保存於【只讀】內存區域內。程序各處僅能拿到static單實例的引用。 -
let- 保存變量值於【棧】內存的【幀】中,且隨着函數執行結束,而被釋放。
就Drop trait而言,
-
static- 其生命週期等長於整個應用程序(即,無限生命)。所以,即使static值被實現了Drop trait,它的drop()成員函數也沒有機會被調用。 -
const與let都是 “有限生命”,超出了作用域都得被釋放。若實現了Drop trait,它的drop()成員函數一定會被調用。
就【類型註釋】來講,
-
static與const都要求Rustacean顯示地標註變量的數據類型,不支持類型推斷。 -
let支持變量類型推斷,數據類型標註項可以被省略。
就【生命週期】來講,
-
static與const都要求'static。但根據static lifetime elision規則,生命週期標註可缺省。 -
let沒有限制
就trait bound而言,
-
static要求靜態量必須是Sync trait。即,單實例的引用可在線程間安全地共享。 -
const與let都沒有限制。
就【具名】來講,
-
const與let都被允許聲明一個【不具名】常量(即,常量名爲_)。我是真不理解這有什麼用。 -
static沒有這個能力。
就【可修改性】來講,
-
const門也沒有 -
static就得話分兩說了: -
直接
static mut聲明可修改變量,會導致unsafe代碼。無論讀還是寫static mut值都是unsafe的。 -
藉助
interior Mutability讓【編譯時】只讀的變量在【運行時】可修改,可繞過unsafe約束。但要區分處理單線程RefCell<T>與多線程Mutex<T>的使用場景。 -
let和static類似,只是let mut聲明可修改變量不會導致unsafe代碼。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/y6LSikdyoSunM4BTl_87ig