Rust 是一門強(qiáng)調(diào)安全、并發(fā)、高效的系統(tǒng)編程語(yǔ)言。無(wú) GC 實(shí)現(xiàn)內(nèi)存安全機(jī)制、無(wú)數(shù)據(jù)競(jìng)爭(zhēng)的并發(fā)機(jī)制、無(wú)運(yùn)行時(shí)開(kāi)銷的抽象機(jī)制,是 Rust 獨(dú)特的優(yōu)越特性。 它聲稱解決了傳統(tǒng) C 語(yǔ)言和 C++語(yǔ)言幾十年來(lái)飽受責(zé)難的內(nèi)存安全問(wèn)題,同時(shí)還保持了很高的運(yùn)行效率、很深的底層控制、很廣的應(yīng)用范圍, 在系統(tǒng)編程領(lǐng)域具有強(qiáng)勁的競(jìng)爭(zhēng)力和廣闊的應(yīng)用前景。
在 Rust 筆記(三)中,講了復(fù)核類型,本文就認(rèn)識(shí)一下 Rust 中的變量。
Rust 默認(rèn)支持類型推導(dǎo),在編譯器能夠推導(dǎo)類型的情況下,變量類型一般可以省略,但常量(const)和靜態(tài)變量(static)必須聲明類型。
圖片
let a: &str = "一個(gè)不可變變量";const B: &str = "一個(gè)常量";static C: &str = "一個(gè)靜態(tài)變量";
變量默認(rèn)是不可變的。如果需要讓變量具有可變性,必須為變量添加 mut 關(guān)鍵字。默認(rèn)變量不可變是一個(gè)很重要的特性,它符合最小權(quán)限原則(Principle of Least Privilege),有助于我們寫出健壯且正確的代碼。當(dāng)你使用 mut 卻沒(méi)有修改變量,Rust 編譯期會(huì)友好地報(bào)警,提示你移除不必要的 mut。
let mut x = 10; // 聲明一個(gè)可變的整型變量x = 20; // 可以修改 x 的值
當(dāng)使用 mut 關(guān)鍵字聲明一個(gè)引用時(shí),該引用就可以被修改所指向的變量,例如:
let mut s = String::from("hello");let r = &mut s; // 聲明一個(gè)可變的字符串引用r.push_str(" world!"); // 可以修改 s 的值
在其他大多數(shù)語(yǔ)言中,要么只支持申明可變的變量,要么只支持申明不可變的變量,但是 Rust 就不一樣了,兩者我都要,既要靈活性又要安全性。還有一個(gè)很大的優(yōu)點(diǎn),那就是運(yùn)行性能上的提升,因?yàn)閷⒈旧頍o(wú)需改變的變量聲明為不可變?cè)谶\(yùn)行期會(huì)避免一些多余的 runtime 檢查。
選擇可變還是不可變,更多的還是取決于你的使用場(chǎng)景,
在 Rust 中創(chuàng)建了一個(gè)變量卻不在任何地方使用它,Rust 會(huì)給你一個(gè)警告,因?yàn)檫@可能會(huì)是個(gè) BUG。
圖片
但是有時(shí)創(chuàng)建一個(gè)不會(huì)被使用的變量是有用的,比如你正在設(shè)計(jì)原型或剛剛開(kāi)始一個(gè)項(xiàng)目。這時(shí)你希望告訴 Rust 不要警告未使用的變量,為此可以用下劃線作為變量名的開(kāi)頭:
圖片
在其他語(yǔ)言中,比如 JS,我們使用 var a = "Hello World"。意思是將 "Hello World" 賦值給變量 a。在 Rust 中,let a = "Hello World",意思和 JS 中一樣,但是這個(gè)過(guò)程起了有一個(gè)名字:變量綁定。
其實(shí)本質(zhì)上是一回事,賦值 === 綁定,但是 Rust 存在“所有權(quán)”這一特性,所以綁定的含義更清晰準(zhǔn)確。綁定就是把這個(gè)對(duì)象綁定給一個(gè)變量,讓這個(gè)變量成為它的主人。
let 表達(dá)式不僅僅用于變量的綁定,還能進(jìn)行復(fù)雜變量的解構(gòu):從一個(gè)相對(duì)復(fù)雜的變量中,匹配出該變量的一部分內(nèi)容:
let (a, mut b): (bool, bool) = (true, false);// a = true,不可變; b = false,可變println!("a = {:?}, b = {:?}", a, b);
也可以進(jìn)行變量的解構(gòu)賦值:
let (a, b, c, d, e);(a, b) = (1, 2);
Rust 允許對(duì)申明的變量再次聲明,也就是允許申明相同的變量,后面的變量就會(huì)遮蔽前端的變量。
let x: i32 = 1;let x: i32 = 2;let x: i32 = x +1;println!("x: {}", x);
這和 mut 變量的使用是不同的,第二個(gè) let 生成了完全不同的新變量,兩個(gè)變量只是恰好擁有同樣的名稱,涉及一次內(nèi)存對(duì)象的再分配 ,而 mut 聲明的變量,可以修改同一個(gè)內(nèi)存地址上的值,并不會(huì)發(fā)生內(nèi)存對(duì)象的再分配,性能要更好。
在命名方面,和其它語(yǔ)言沒(méi)有區(qū)別,不過(guò)當(dāng)給變量命名時(shí),需要遵循 Rust 命名規(guī)范。詳情可看RFC 430
有變量就有常量。常量也是綁定到一個(gè)常量名且不允許更改的值,但是常量和變量之間存在一些差異:
let a: &str = "一個(gè)不可變變量";const B: &str = "一個(gè)常量";
常量可以在任意作用域內(nèi)聲明(包括全局作用域),在聲明的作用域內(nèi),常量在運(yùn)行的整個(gè)過(guò)程中都有效。對(duì)于需要在多處代碼共享一個(gè)不可變的值時(shí)非常有用。
本文鏈接:http://www.tebozhan.com/showinfo-26-16138-0.html我們一起聊聊 Rust 變量,你學(xué)會(huì)了嗎?
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com
上一篇: WorkBox 之底層邏輯Service Worker
下一篇: 告別硬編碼,SpringBoot實(shí)現(xiàn)動(dòng)態(tài)增刪啟停定時(shí)任務(wù)