2016-06-17 76 views
11

我瞭解到如果一個變量沒有使用mut顯式聲明爲mutable,它就變成不可變的(它不能在聲明後改變)。那麼爲什麼我們在Rust中有const關鍵字?他們不一樣嗎?如果不是,他們有什麼不同?Rust中的immutable和const變量有什麼區別?

回答

11
const

,拉斯特,是短期的恆定並且與編譯時計算。它顯示了:

  • 聲明時常量:const FOO: usize = 3;聲明時
  • 編譯時評估的功能:const fn foo() -> &'static str

這些類型的值可以被用作通用參數:[u8; FOO]。目前這僅限於數組大小,但有一些談話,計劃和希望將來會進一步擴展。

相比之下,let結合是大約一個運行時計算的值。

注意的是,儘管mut被使用,因爲可變性的概念是衆所周知的,實際上鏽就在這裏。 &T&mut T約爲走樣,不可變性:

  • &T:共享參考
  • &mut T:唯一的參考

最值得注意的是,某些類型的特徵內部易變性並且可以經由&T被突變(共享的參考文獻):CellRefCellMutex


注:還存在另一種使用的mutconst與這裏不討論原始指針(*mut T*const T)。

1

const是與需要的一切編譯時間常數。例如,您可以創建一個固定大小的數組,其大小爲const,但您無法通過綁定let來完成此操作。當然,這也意味着您可以將更多的東西放入let綁定中,而不是放入const

8

const不變量;它適用於不能存儲在任何地方的恆定值;它們實際上是字面值的別名。

mutlet宣佈其在運行時創建一個實際的變量,可以移動(而不再訪問),甚至有內部的可變性(如果它包含Cell成員,例如)在某些情況下。

0

常量不能重新定義:

let x = 10u32; 
const Y:u32 = 20u32; 

let x = 11u32; 
//error: duplicate definition of value `Y` [E0428] 
//const Y:u32 = 21u32; 

println!("x={} Y={}",x,Y); //x=11 Y=20 
相關問題