【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