Rust 基礎(chǔ)語法
變量,基本類型,函數(shù),注釋和控制流,這些幾乎是每種編程語言都具有的編程概念。
這些基礎(chǔ)概念將存在于每個 Rust 程序中,及早學(xué)習(xí)它們將使你以最快的速度學(xué)習(xí) Rust 的使用。
變量
首先必須說明,Rust 是強(qiáng)類型語言,但具有自動判斷變量類型的能力。這很容易讓人與弱類型語言產(chǎn)生混淆。
如果要聲明變量,需要使用 let 關(guān)鍵字。例如:
let a = 123;
只學(xué)習(xí)過 JavaScript 的開發(fā)者對這句話很敏感,只學(xué)習(xí)過 C 語言的開發(fā)者對這句話很不理解。
在這句聲明語句之后,以下三行代碼都是被禁止的:
a = "abc";
a = 4.56;
a = 456;
第一行的錯誤在于當(dāng)聲明 a 是 123 以后,a 就被確定為整型數(shù)字,不能把字符串類型的值賦給它。
第二行的錯誤在于自動轉(zhuǎn)換數(shù)字精度有損失,Rust 語言不允許精度有損失的自動數(shù)據(jù)類型轉(zhuǎn)換。
第三行的錯誤在于 a 不是個可變變量。
前兩種錯誤很容易理解,但第三個是什么意思?難道 a 不是個變量嗎?
這就牽扯到了 Rust 語言為了高并發(fā)安全而做的設(shè)計:在語言層面盡量少的讓變量的值可以改變。所以 a 的值不可變。但這不意味著 a 不是"變量"(英文中的 variable),官方文檔稱 a 這種變量為"不可變變量"。
如果我們編寫的程序的一部分在假設(shè)值永遠(yuǎn)不會改變的情況下運(yùn)行,而我們代碼的另一部分在改變該值,那么代碼的第一部分可能就不會按照設(shè)計的意圖去運(yùn)轉(zhuǎn)。由于這種原因造成的錯誤很難在事后找到。這是 Rust 語言設(shè)計這種機(jī)制的原因。
當(dāng)然,使變量變得"可變"(mutable)只需一個 mut 關(guān)鍵字。
let mut a = 123;
a = 456;
這個程序是正確的。
常量與不可變變量的區(qū)別
既然不可變變量是不可變的,那不就是常量嗎?為什么叫變量?
變量和常量還是有區(qū)別的。在 Rust 中,以下程序是合法的:
let a = 123; // 可以編譯,但可能有警告,因?yàn)樵撟兞繘]有被使用
let a = 456;
但是如果 a 是常量就不合法:
const a: i32 = 123;
let a = 456;
變量的值可以"重新綁定",但在"重新綁定"以前不能私自被改變,這樣可以確保在每一次"綁定"之后的區(qū)域里編譯器可以充分的推理程序邏輯。 雖然 Rust 有自動判斷類型的功能,但有些情況下聲明類型更加方便:
let a: u64 = 123;
這里聲明了 a 為無符號 64 位整型變量,如果沒有聲明類型,a 將自動被判斷為有符號 32 位整型變量,這對于 a 的取值范圍有很大的影響。
重影(Shadowing)
重影的概念與其他面向?qū)ο笳Z言里的"重寫"(Override)或"重載"(Overload)是不一樣的。重影就是剛才講述的所謂"重新綁定",之所以加引號就是為了在沒有介紹這個概念的時候代替一下概念。
重影就是指變量的名稱可以被重新使用的機(jī)制:
實(shí)例
fn main() {
let x = 5;
let x = x + 1;
let x = x * 2;
println!("The value of x is: {}", x);
}
這段程序的運(yùn)行結(jié)果:
The value of x is: 12
重影與可變變量的賦值不是一個概念,重影是指用同一個名字重新代表另一個變量實(shí)體,其類型、可變屬性和值都可以變化。但可變變量賦值僅能發(fā)生值的變化。
let mut s = "123";
s = s.len();
這段程序會出錯:不能給字符串變量賦整型值。
總結(jié)
-
rust 作為強(qiáng)類型語言,但是也有自動判斷類型的能力,所以它的使用有點(diǎn)類似于c++的
size_t
或者auto
。我們使用的關(guān)鍵字是let
。 可以簡單記錄為 let 走天下。創(chuàng)建變量?let
。更新變量 ?let
。 -
由此引出第二點(diǎn),不再是傳統(tǒng)的一次創(chuàng)建,任意更改。
- 在
rust
中,由于為高并發(fā)而做的努力,它不再允許隨意更改。 - 你可以想象在以往高并發(fā)中死鎖和數(shù)據(jù)污染導(dǎo)致的令人頭大的后果和補(bǔ)救措施,以及我們?yōu)榇俗龀龅木薮笸讌f(xié)和投入了大量的成本。
- 現(xiàn)在,我們將他限制住了。
- 在
-
每次修改變量時,有兩種方式:
- 使用
let
關(guān)鍵字每次修改,重新聲明。(既是重影)- 這樣使用時,編譯會告警。
- 添加
mut
關(guān)鍵字 (mutable)let mut zry = 123; zry = 432; //但是類型修改時還是不行,這是原則問題>_< zry = 'zry'; zry = 123.1;
- 使用
-
后置的類型強(qiáng)聲明
- 在rust 中,類型的聲明是可以顯式限制的,畢竟是強(qiáng)類型嘛。
- 在顯式聲明時, 語法為 變量后
:類型
如:let z: i32 = 123; let r: u64 = 234;
- 其意義在于當(dāng)我們想以更大的空間容納數(shù)據(jù)但我又不想使用新的空間時,或者想要預(yù)留更大的空間時方便
-
重影
- 在學(xué)習(xí)Rust 的過程中,你會發(fā)現(xiàn)一些很酷的內(nèi)容,我們在重定義變量這個操作時,不會直白的說,我在這里重定義了,而是說 重影。這個蠻中二的詞雀氏讓我有種高大冷峻的范。
- 那么實(shí)際重影做的是什么呢?我們之前說了Rust 并發(fā)安全,所以限制隨意修改變量值。但我們有兩種方式實(shí)現(xiàn)修改。第一種就是重影。
- 代碼實(shí)現(xiàn):
let z = 1; let z = z+1; let z = z*2; let z = z*z; printin!("z is {}",z);
文章來源:http://www.zghlxwxcb.cn/news/detail-492832.html
-
mut
改變的只能是同類型值文章來源地址http://www.zghlxwxcb.cn/news/detail-492832.html
到了這里,關(guān)于Rust 基礎(chǔ)語法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!