鍍金池/ 教程/ Java/ “常量”和“靜態(tài)”
While 循環(huán)
宏命令
模式
Rust 嵌入到其他語言
變量綁定
if
發(fā)布通道
Lang 項(xiàng)目
匹配
文檔
棧和堆
不依賴 stdlib
原始指針
條件編譯
type 別名
關(guān)聯(lián)類型
全類型
詞匯表
基本類型
Hello, world!
測試
箱和模塊
字符串
向量
引用與借用
所有權(quán)
內(nèi)斂函數(shù)
基準(zhǔn)測試
Nightly Rust
for 循環(huán)
特征
特征的對象
鏈接參數(shù)
介紹
'Deref'強(qiáng)制轉(zhuǎn)換
枚舉
內(nèi)聯(lián)匯編
泛型
方法語法
函數(shù)
外部函數(shù)接口
盒語法和模式
安裝 Rust
unsafe    
生存期
切片模式
Borrow 和 AsRef
If let
學(xué)習(xí) Rust
“常量”和“靜態(tài)”
語法和語義
迭代器
相關(guān)學(xué)術(shù)研究
通用函數(shù)調(diào)用語法
哲學(xué)家就餐問題
類型轉(zhuǎn)換
閉包
并發(fā)性
Hello, Cargo!
屬性
注釋
結(jié)構(gòu)體
編譯器插件
高效 Rust
相關(guān)常量
猜謎游戲
可變性
錯(cuò)誤處理
新手入門
操作符和重載

“常量”和“靜態(tài)”

Rust 有用 const 關(guān)鍵字定義常量的方法:

const N: i32 = 5;

不像 let 綁定那樣,您必須標(biāo)注常量的類型。

常量活在程序的整個(gè)生命周期。更具體地說,在 Rust 語言里面常量沒有固定內(nèi)存地址。這是因?yàn)樗麄儠?huì)被有效的內(nèi)聯(lián)到每個(gè)使用地方。引用相同的常數(shù)并不一定保證引用同一個(gè)內(nèi)存地址也是因?yàn)檫@個(gè)原因。

靜態(tài)

Rust 在靜態(tài)條目中提供一種“全局變量”。它們類似于常量,但靜態(tài)條目不內(nèi)聯(lián)使用。這意味著每個(gè)值只對應(yīng)一個(gè)實(shí)例, 并且在內(nèi)存中只有一個(gè)固定的地址。

這里有一個(gè)例子:

static N: i32 = 5;

不像 let 綁定那樣,您必須標(biāo)注一個(gè)靜態(tài)的類型。

靜態(tài)類型活在程序的整個(gè)生命周期,因此任何存儲(chǔ)在常量中的引用都有“靜態(tài)生命周期:

static NAME: &'static str = "Steve";

可變性

你可以用 mut 關(guān)鍵字介紹可變性:

static mut N: i32 = 5;

因?yàn)檫@是可變的,一個(gè)線程正在更新 N,而此時(shí)另一個(gè)正在讀入它,這樣會(huì)導(dǎo)致內(nèi)存不安全。這樣訪問和改變一個(gè)靜態(tài) mut 是不安全的,所以必須在一個(gè)unsafe 的塊里面完成:

unsafe {
N += 1;

println!("N: {}", N);
}

此外,任何存儲(chǔ)在 static 的類型都必須是 Sync。

初始化

常量和靜態(tài)常量都要求給他們一個(gè)值。并且他們可能只被賦予一個(gè)值,這個(gè)值是一個(gè)常數(shù)表達(dá)式。換句話說,在程序運(yùn)行時(shí),您不能使用函數(shù)調(diào)用的結(jié)果或任何其他類似的復(fù)雜操作。

我應(yīng)該使用哪個(gè)構(gòu)造?

幾乎總是如此,如果你能在兩者之間選擇,那么就選擇常量。人們幾乎不怎么希望內(nèi)存地址與你的常量關(guān)聯(lián)到一起,并且允許對常量進(jìn)行優(yōu)化,就像常量的使用范圍不僅在本程序塊也在下游程序塊一樣。

常量可以被認(rèn)為是在 C 語 言中用 # define 定義的:這里會(huì)有元數(shù)據(jù)開銷,但沒有運(yùn)行開銷?!霸?C 語言中,我應(yīng)該使用 # define 還是 static,“很大程度與這個(gè)問題是相同的,“在 Rus t語言中,我是應(yīng)該使用 const 還是 static”。

上一篇:棧和堆下一篇:基本類型