Rust有一個用`const`關鍵字定義常量的方法:
~~~
const N: i32 = 5;
~~~
與[let](http://doc.rust-lang.org/nightly/book/variable-bindings.html)綁定不同,你必須標注一個`const`的類型。
常量貫穿于整個程序的生命周期。更具體的,Rust中的常量并沒有固定的內存地址。這是因為實際上它們會被內聯到用到它們的地方。為此對同一常量的引用并不能保證引用到相同的內存地址。
## `static`
Rust以靜態量的方式提供了類似“全局變量”的功能。它們與常量類似,不過靜態量在使用時并不內聯。這意味著對每一個值只有一個實例,并且位于內存中的固定位置。
這是一個栗子:
~~~
static N: i32 = 5;
~~~
與[let](http://doc.rust-lang.org/nightly/book/variable-bindings.html)綁定不同,你必須標注一個`static`的類型。
靜態量貫穿于整個程序的生命周期,因此任何存儲在常量中的引用有一個[`’static`生命周期](http://doc.rust-lang.org/nightly/book/lifetimes.html):
~~~
static NAME: &'static str = "Steve";
~~~
## 可變性
你可以用`mut`關鍵字引入可變性:
~~~
static mut N: i32 = 5;
~~~
因為這是可變的,一個線程可能在更新`N`同時另一個在讀取它,導致內存不安全。因此訪問和改變一個`static mut`是[不安全(unsafe)](http://doc.rust-lang.org/nightly/book/unsafe.html)的,因此必須在`unsafe`塊中操作:
~~~
unsafe {
N += 1;
println!("N: {}", N);
}
~~~
更進一步,任何存儲在`static`的類型必須實現`Sync`。
## 初始化
`const`和`static`都要求賦予它們一個值。它們只能被賦予一個常量表達式的值。換句話說,你不能用一個函數調用的返回值或任何相似的復合值或在運行時賦值。
## 我應該用哪個?(Which construct should I use?)
幾乎所有時候,如果你可以在兩者之間選擇,選擇`const`。實際上你很少需要你的常量關聯一個內存位置,而且使用常量允許你不止在在自己的包裝箱還可以在下游包裝箱中使用像常數擴散這樣的優化。
一個常量可以看作一個C中的`#define`:它有元數據開銷但無運行時開銷。“我應該在C中用一個#define或者一個static呢?”大體上與在Rust你應該用常量還是靜態量是一個問題。
- 前言
- 1.介紹
- 2.準備
- 2.1.安裝Rust
- 2.2.Hello, world!
- 2.3.Hello, Cargo!
- 3.學習Rust
- 3.1.猜猜看
- 3.2.哲學家就餐問題
- 3.3.其它語言中的Rust
- 4.高效Rust
- 4.1.棧和堆
- 4.2.測試
- 4.3.條件編譯
- 4.4.文檔
- 4.5.迭代器
- 4.6.并發
- 4.7.錯誤處理
- 4.8.外部語言接口
- 4.9.Borrow 和 AsRef
- 4.10.發布途徑
- 5.語法和語義
- 5.1.變量綁定
- 5.2.函數
- 5.3.原生類型
- 5.4.注釋
- 5.5.If語句
- 5.6.for循環
- 5.7.while循環
- 5.8.所有權
- 5.9.引用和借用
- 5.10.生命周期
- 5.11.可變性
- 5.12.結構體
- 5.13.枚舉
- 5.14.匹配
- 5.15.模式
- 5.16.方法語法
- 5.17.Vectors
- 5.18.字符串
- 5.19.泛型
- 5.20.Traits
- 5.21.Drop
- 5.22.if let
- 5.23.trait對象
- 5.24.閉包
- 5.25.通用函數調用語法
- 5.26.包裝箱和模塊
- 5.27.`const`和`static`
- 5.28.屬性
- 5.29.`type`別名
- 5.30.類型轉換
- 5.31.關聯類型
- 5.32.不定長類型
- 5.33.運算符和重載
- 5.34.`Deref`強制多態
- 5.35.宏
- 5.36.裸指針
- 6.Rust開發版
- 6.1.編譯器插件
- 6.2.內聯匯編
- 6.3.不使用標準庫
- 6.4.固有功能
- 6.5.語言項
- 6.6.鏈接參數
- 6.7.基準測試
- 6.8.裝箱語法和模式
- 6.9.切片模式
- 6.10.關聯常量
- 7.詞匯表
- 8.學院派研究
- 勘誤