- Rust編程:入門、實戰與進階
- 朱春雷
- 1748字
- 2021-04-30 12:37:22
2.1 變量和可變性
Rust的變量不同于其他編程語言的變量,其本質上是一種綁定語義,即將一個變量名與一個值綁定在一起。變量名和值建立關聯關系。另一個不同點是變量默認是不可改變的,這是為了讓開發者能充分利用Rust提供的安全性來編寫代碼。當然,Rust也提供了使用可變變量的方式。下面具體介紹變量聲明和可變變量以及常量的使用。
2.1.1 變量聲明
Rust通過let關鍵字聲明變量,變量遵循先聲明后使用的原則。變量聲明的語法如下:
1 let x: i8 = 1; 2 let x = 1; // 等價于:let x: i32 = 1;
變量聲明以let關鍵字開頭,x為變量名,變量名后緊跟冒號和數據類型。Rust編譯器具有變量類型的自動推導功能。在可以根據賦值類型或上下文信息推導出變量類型的情況下,冒號和數據類型可以省略。
變量名必須由字母、數字、下劃線組成,字母區分大小寫且不能以數字開頭,也不能只有下劃線。Rust中下劃線是一種特殊的標識符,其含義是“忽略這個變量”,后續章節中會用到這個標識符。
2.1.2 變量的可變性
let聲明的變量默認是不可變的,在第一次賦值后不能通過再次賦值來改變它的值,即聲明的變量是只讀狀態。代碼清單2-1中,第3行代碼嘗試對不可變變量x進行二次賦值,即進行寫操作,這是不被允許的。編譯代碼,將會拋出cannot assign twice to immutable variable `x`的錯誤提示。根據錯誤提示信息可知,不能對不可變變量進行二次賦值。
代碼清單2-1 對不可變變量二次賦值
1 fn main() { 2 let x = 3; 3 x = 5; 4 println!("x: {}", x); 5 }
在變量名的前面加上mut關鍵字就是告訴編譯器這個變量是可以重新賦值的。代碼清單2-2中,第2行代碼中的mut關鍵字將變量x聲明為可變變量,即x為可寫狀態。編譯代碼,不再出現上述錯誤。
代碼清單2-2 對可變變量二次賦值
1 fn main() { 2 let mut x = 3; 3 x = 5; 4 println!("x: {}", x); 5 } 6 7 // x: 5
將變量區分為可變與不可變兩種狀態,是Rust語言安全性的一大體現。因為在大型程序中,如果有一部分代碼假設一個變量為不可變的只讀狀態,而另一部分代碼卻嘗試改變這一預設為可變變量,那么第一部分代碼就有可能以不可預料的方式運行,這種bug將很難被跟蹤調試。而Rust編譯器保證了如果一個變量聲明為不可變變量,那它就真的不會變。當然,變量的可變性也是非常有用的,只需在變量名之前加mut關鍵字即可。這種聲明方式除了允許改變該變量值之外,還明確傳達了允許其他代碼改變這個變量值的意圖。
變量的可變性聲明是初學者進行Rust編程時最容易出錯的地方,在實戰章節還會對此做重點講解。
2.1.3 變量遮蔽
Rust允許在同一個代碼塊中聲明一個與之前已聲明變量同名的新變量,新變量會遮蔽之前的變量,即無法再去訪問前一個同名的變量,這樣就實現了變量遮蔽。
代碼清單2-3中,第2行代碼聲明變量x并與值3綁定,第3行代碼獲取x的值加2得到5,并通過let關鍵字聲明新的變量x與值5綁定。此時,第一個變量x已被遮蔽,當前x的值變成了5。第4行代碼獲取x的值乘以2得到10,并通過let關鍵字再次聲明新的變量x與值10綁定,當前x的值變成了10。第7行代碼聲明了新的變量x與字符串“Hello, Rust!”綁定,此時變量x已由i32類型變為&str類型。
代碼清單2-3 變量遮蔽
1 fn main() { 2 let x = 3; 3 let x = x + 2; 4 let x = x * 2; 5 println!("x: {}", x); 6 7 let x = "Hello, Rust!"; 8 println!("x: {}", x); 9 } 10 11 // x: 10 12 // x: Hello, Rust!
變量遮蔽的實質是通過let關鍵字聲明了一個新的變量,只是名稱恰巧與前一個變量名相同而已,但它們是兩個完全不同的變量,處于不同的內存空間,值可以不同,值的類型也可以不同。變量遮蔽常應用于一些特殊場景,在后續實戰章節中會用到。
2.1.4 常量
常量是指綁定到一個標識符且不允許改變的值,一旦定義后就沒有任何方法能改變其值了。Rust聲明常量的語法如下:
const MAX_NUM: u32 = 1024;
Rust使用const關鍵字來聲明常量。常量名通常是大寫字母,且必須指定常量的數據類型。常量與不可變變量的區別主要在于:
1)常量聲明使用const關鍵字,且必須注明值的類型。
2)通過變量遮蔽的方式可以讓不可變變量的值改變(本質上是新的變量,只是同名而已)。但是,常量不能遮蔽,不能重復定義。也就是說,不存在內層或后面作用域定義的常量去遮蔽外層或前面定義的同名常量的情況。常量一旦定義后就永遠不可變更和重新賦值。
3)常量可以在任何作用域中聲明,包括全局作用域。在聲明它的作用域中,常量在整個程序生命周期內都有效,這使得常量可以作為多處代碼共同使用的全局范圍的值。
4)常量只能被賦值為常量表達式或數學表達式,不能是函數返回值,或是其他在運行時才能確定的值。
- Web開發的貴族:ASP.NET 3.5+SQL Server 2008
- Spring Cloud、Nginx高并發核心編程
- HTML5+CSS3網站設計教程
- SQL Server 2012數據庫管理與開發項目教程
- 軟件架構:Python語言實現
- Yocto for Raspberry Pi
- 小程序開發原理與實戰
- Java系統化項目開發教程
- Test-Driven Development with Django
- Distributed Computing in Java 9
- Java EE Web應用開發基礎
- Java7程序設計入門經典
- Python大規模機器學習
- 青少年Python趣味編程
- React and React Native