前言
任何一門編程語言幾乎都脫離不了:變量、基本類型、函數(shù)、注釋、循環(huán)、條件判斷,這是一門編程語言的語法基礎(chǔ),只有當(dāng)掌握這些基礎(chǔ)語法及概念才能更好的學(xué)習(xí) Rust。
變量介紹
Rust 是一種強(qiáng)類型語言,但在聲明變量時(shí),不總是需要顯式聲明類型,這是因?yàn)?Rust 的編譯器有類型推斷系統(tǒng)。當(dāng)聲明一個(gè)變量而沒有指定類型時(shí),Rust 編譯器會(huì)根據(jù)變量的初始值自動(dòng)推斷出它的類型。
在強(qiáng)類型語言中,每個(gè)變量和常量都必須有一個(gè)明確的類型,而且類型在編譯時(shí)就已經(jīng)確定。Rust 編譯器非常嚴(yán)格,不允許不同類型的數(shù)據(jù)隱式轉(zhuǎn)換。如果需要將一個(gè)類型轉(zhuǎn)換為另一個(gè)類型,必須使用明確的類型轉(zhuǎn)換方法。這一特性使得 Rust 在編譯時(shí)能夠提供類型檢查,有助于避免許多常見的運(yùn)行時(shí)錯(cuò)誤。
不可變變量 (Immutable)
與其他編程語言(如:Java、Python、JS)不同,默認(rèn)情況下 Rust 中的變量是不可變的 (神奇,變量不可變??)。
這一特性意味著變量一旦被賦值后,在變量的整個(gè)生命周期內(nèi)它的值就不能被改變,嘗試修改一個(gè)不可變變量的值會(huì)導(dǎo)致編譯時(shí)錯(cuò)誤。
示例:
let x = 5;
x = 6; // 這會(huì)導(dǎo)致編譯錯(cuò)誤,因?yàn)?x 是不可變的
可變變量 (Mutable)
- 通過使用?
mut
?關(guān)鍵字,可以聲明一個(gè)可變的變量,這樣的變量允許其值在后續(xù)被修改。 - 但需要注意,rust 作為強(qiáng)類型語言,修改變量時(shí)不允許賦值其他類型的值
示例:
let mut x = 5;
x = 6; // 這是允許的,因?yàn)?x 是可變的
// error[E0308]: mismatched types
x = 3.1415926; // 3.1415926 是浮點(diǎn)數(shù),x 聲明時(shí)是整形
變量遮蔽(Shadowing)
變量遮蔽是 Rust 中的一個(gè)特性,有些文檔或教程將 Shadowing
稱為:隱藏
、重影
,它允許在相同作用域中,使用相同的名稱聲明一個(gè)新變量。這個(gè)新聲明的變量“遮蔽”了先前聲明的同名變量。更準(zhǔn)確地說,當(dāng)新變量被引入時(shí),它會(huì)使得與之同名的先前變量不再可見,直到新變量離開作用域前,無法訪問被遮蔽的變量。這與變量重新賦值不同,因?yàn)樗鼘?shí)際上是在創(chuàng)建一個(gè)全新的變量。
遮蔽的好處是可以重新使用更有意義或適用于當(dāng)前上下文的變量名,遮蔽通常用于轉(zhuǎn)換值的類型或給變量一個(gè)新值,而這樣做并不影響原來變量的不可變性。
示例1:
let x = 5;
let x = x + 1; // 遮蔽前一個(gè) x 變量
let x = "現(xiàn)在 x 是一個(gè)字符串"; // 再次遮蔽,改變了值的類型
示例2:
fn main() {
let x = 5;
let x = x + 1;
{
// 在使用花括號(hào)創(chuàng)建的內(nèi)部作用域內(nèi),變量 `x` 被遮蔽
let x = x * 2;
println!("x 在當(dāng)前作用域的值是: {x}"); // 12
}
// 當(dāng)作用域結(jié)束后,內(nèi)部 shadowing 的作用域也結(jié)束了,`x` 又返回到 `6`
println!("x 在當(dāng)前作用域的值是: {x}"); // 6
}
常量 (Constants)
- 常量使用?
const
?關(guān)鍵字聲明,并且它們總是不可變的。 - 常量必須在聲明時(shí)就賦值,而且它們的類型必須顯式聲明。
- 常量名應(yīng)該全部大寫,否則會(huì)報(bào)警告。
示例:
const MAX_POINT: u32 = 100_000;
不可變變量 與 常量的區(qū)別
在 Rust 中,雖然不可變變量和常量都不能在聲明后被修改,但它們之間存在幾個(gè)主要區(qū)別:
類型標(biāo)注
- 聲明常量時(shí),必須顯式給出類型標(biāo)注
- 不可變變量通常可以依賴 Rust 的類型推斷,類型標(biāo)注是可選的。
示例:
// ok!
let x = 1000;
// error: missing type for `const` item
const CONST_VAL = 1000;
值的賦予時(shí)機(jī)
- 常量在編譯時(shí)被賦值,且必須是一個(gè)恒定的表達(dá)式,不能是運(yùn)行時(shí)的結(jié)果。
- 不可變變量可以在運(yùn)行時(shí)被初始化,其中的值可以是在運(yùn)行時(shí)才能確定的表達(dá)式的結(jié)果。
示例1:
fn get_val() -> i32 {
1000
}
fn main() {
// ok!
let x = get_val();
// const 不能接收運(yùn)行時(shí)的結(jié)果
// error[E0015]: cannot call non-const fn `get_val` in constants
const CONST_VAL: i32 = get_val();
}
示例2:
fn main() {
// let 允許先聲明,后賦值
let x;
x = 1000;
// error: free constant item without body
const CONST_VAL: i32;
// error[E0070]: invalid left-hand side of assignment
CONST_VAL = 1000;
}
變量遮蔽
- 不可變變量可以通過變量遮蔽進(jìn)行重新賦值
- 常量無法進(jìn)行變量遮蔽,相同常量名重復(fù)定義時(shí)會(huì)報(bào)錯(cuò)
示例:
let x = 1000;
// ok!
let x = "str";
const CONST_VAL: i32 = 1000;
// // error[E0428]: the name `CONST_VAL` is defined multiple times
const CONST_VAL: &str = "str";
作用域
-
let
關(guān)鍵字用于在局部作用域中聲明變量,如函數(shù)或代碼塊內(nèi)部,而不能用于全局作用域。 -
const
關(guān)鍵字可以用于全局作用域中聲明常量,也可以在局部作用域中使用。
示例:文章來源:http://www.zghlxwxcb.cn/news/detail-827670.html
const GLOBAL_CONST: i32 = 10; // 全局常量,可以在整個(gè)程序中訪問
// error: expected item, found keyword `let`
// let x = 1000; // 不允許聲明全局變量
fn main() {
let local_var = 5; // 局部變量,只能在 main 函數(shù)內(nèi)訪問
println!("常量: {}", GLOBAL_CONST);
println!("局部變量: {}", local_var);
}
fn another_function() {
// local_var 在這里是不可見的,因?yàn)樗辉谧饔糜騼?nèi)
// GLOBAL_CONST 仍然是可見的
println!("同一個(gè)常量: {}", GLOBAL_CONST);
}
結(jié)語
本文深入介紹了 Rust 中的變量聲明,特別是它獨(dú)有的不可變變量和變量遮蔽特性。相較于其它編程語言,這些概念初看可能會(huì)給變量操作帶來復(fù)雜性。然而,隨著使用的深入,這些概念將變得清晰明了,你將發(fā)現(xiàn)它們實(shí)際上是 Rust 強(qiáng)大功能和安全性的體現(xiàn),而且并不復(fù)雜。文章來源地址http://www.zghlxwxcb.cn/news/detail-827670.html
到了這里,關(guān)于Rust 學(xué)習(xí)筆記 - 變量聲明與使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!