摸個(gè)筆記
- 首先討論的第一點(diǎn),就是對于傳統(tǒng)的開發(fā)者來說明:為什么要去用 這樣手動設(shè)定的方式設(shè)定變量的可行性。
- Course給出的解釋是——苦一苦開發(fā),樂一樂運(yùn)維。
- 好吧,讓我們理解,程序員的懶惰和貪婪是無止境的,我們想要一種類型自行推斷,但是性能提高、安全非常的方式。在未解決前,先權(quán)衡吧。
[[Rust 命名規(guī)范]]
變量命名
在命名方面,和其它語言沒有區(qū)別,不過當(dāng)給變量命名時(shí),需要遵循? Rust 命名規(guī)范
大致化用 駝峰命名法 和 蛇形命名法。
Rust 語言有一些關(guān)鍵字(keywords),和其他語言一樣,這些關(guān)鍵字都是被保留給 Rust 語言使用的,因此,它們不能被用作變量或函數(shù)的名稱。在?附錄 A?中可找到關(guān)鍵字列表。
變量綁定
-
在rust 中,我們分為兩部分去探討變量和值。
- 值是rust 中存儲在內(nèi)存空間中的具體數(shù)字,
- 變量,不再是內(nèi)存地址的代稱,而是一個(gè)獨(dú)立內(nèi)容。它綁定對應(yīng)的內(nèi)存空間。因此,在Rust中就存在綁定和解綁的兩部分。
- 這樣就有一個(gè)問題,在解綁和綁定新內(nèi)存空間之后,原來的內(nèi)存對象怎么處理它?
- 以及另一個(gè)新問題:內(nèi)存對象綁定到新的變量對象時(shí),原有的變量對象怎么了?
-
概念 :所有權(quán)
在Rust 中我們把變量賦值,改稱為變量綁定。 而在綁定這個(gè)概念被提出之后,就對應(yīng)的引入了所有權(quán)的概念。 即 —— 內(nèi)存對象是哪個(gè)變量所有的。 -
更近一步的補(bǔ)充需要再學(xué)習(xí)。
變量可變性
在這一節(jié)中,我們聊一下 為什么 Rust 喜歡不可變的變量。
Rust 的關(guān)注點(diǎn):高并發(fā)。以及高并發(fā)天然帶來的 資源使用安全問題。
在多線程編程中,我們常常需要對一些共用資源做出操作,而在大型項(xiàng)目中,多人編程你不能保證他人會按照你的預(yù)期操作你所使用的資源, 這種悲觀保護(hù)情緒,在開發(fā)中給我們帶來了很多額外的容錯(cuò)流程代碼。
Rust想做的事情,就是通過折磨程序員,來剔除懶狗和low的小工。默認(rèn)不可變的變量要求你在使用時(shí)對他投注更大的精力去關(guān)注。
而當(dāng)你需要修改變量時(shí),額外的mut
關(guān)鍵字 提醒了每一個(gè)使用者應(yīng)當(dāng)注意安全使用。
選擇可變還是不可變,更多的還是取決于你的使用場景,例如不可變可以帶來安全性,但是喪失了靈活性和性能(如果你要改變,就要重新創(chuàng)建一個(gè)新的變量,這里涉及到內(nèi)存對象的再分配)。而可變變量最大的好處就是使用上的靈活性和性能上的提升。
例如,在使用大型數(shù)據(jù)結(jié)構(gòu)或者熱點(diǎn)代碼路徑(被大量頻繁調(diào)用)的情形下,在同一內(nèi)存位置更新實(shí)例可能比復(fù)制并返回新分配的實(shí)例要更快。使用較小的數(shù)據(jù)結(jié)構(gòu)時(shí),通常創(chuàng)建新的實(shí)例并以更具函數(shù)式的風(fēng)格來編寫程序,可能會更容易理解,所以值得以較低的性能開銷來確保代碼清晰。
使用下劃線開頭 忽略未使用的變量 和 函數(shù)
正如我們在 介紹 cargo 時(shí)所說的,Rust 有著一個(gè)優(yōu)秀又嚴(yán)格的 編譯器 加管理器,而因?yàn)閲?yán)格,Rust對未使用的函數(shù)和變量都會檢測挑出來。告警 告訴你: 這些內(nèi)容都是未使用的,請注意。
而我們在編碼過程中的時(shí)候,常常處于調(diào)試和測試的過程中,而這時(shí),我們看到滿屏的黃標(biāo)是很影響心情的。
Rust 提供了編碼規(guī)范解決這個(gè)問題, _
當(dāng)我們使用下劃線這個(gè)關(guān)鍵詞的時(shí)候,Rust 認(rèn)為,對應(yīng)的內(nèi)容(變量和函數(shù))是內(nèi)部使用的,不需要向外界提供,因此不再告警未使用了。
比如下面的代碼:
![[Pasted image 20230615165557.png]]
這里上面的編譯運(yùn)行就是告警情況。而下面紅框的就是修改之后清爽的編譯執(zhí)行情況。
附贈測試代碼
fn _test_error_1() {
println!("test_error_1()");
let mut x: usize = 0;
x -= 1;
println!("{}", x);
}
// use std::mem;
fn _test_type_1() {
let a = 11;
let b = 0xFFi16;
println!("{} {}", b, std::mem::size_of_val(&b));
// let b = b:i8; // 類型轉(zhuǎn)換 不行
// println!("{} {}", b, std::mem::size_of_val(&b));
// let b = 0xFFi8; // 隱式強(qiáng)轉(zhuǎn) 不行
// println!("{} {}", b, std::mem::size_of_val(&b));
let b = 0xFF_i32; // 類型標(biāo)注 只能用在值標(biāo)定,不能使用變量
println!("{} {}", b, std::mem::size_of_val(&b));
let b = 30i128;
println!("{} {}", a, std::mem::size_of_val(&b));
let c = 32_i32;
println!("{} {}", b, std::mem::size_of_val(&c));
}
fn _test_add() {
let num = _add(_add(1, 2), _add(3, 4));
println!("{} ", num);
}
fn test_let_info() {
let zry;
zry = 1;
println!("{}", zry);
}
fn main() {
test_let_info();
}
fn _add(i: i32, j: i32) -> i32 {
// return i+j;
i + j
}
變量解構(gòu)
變量解構(gòu)實(shí)際上講的是let
這個(gè)關(guān)鍵字 所提供的一個(gè) 綁定特性。
let
可以對復(fù)雜變量進(jìn)行拆解,然后匹配對應(yīng)的內(nèi)存對象進(jìn)行綁定
所謂復(fù)雜變量是指由基本變量組合而來的 變量對象, 比如 元組,
fn test_let_jiegou() {
let (z,r,y,mut reach): (char,char,char,i32) = ('a', 'a', 'c', 100);
println!("{} {} {} {}", z,r,y,reach);
reach = 111;
assert_eq!(111,reach);
}
fn main() {
test_let_jiegou();
}
在這個(gè)元組中,我們由多個(gè)對象,多個(gè)類型,但是我們可以一次聲明定義完成。
有點(diǎn),c++中 int a = b = c =0; 那味了。當(dāng)然比他更強(qiáng)的是跨類型聲明定義。
更進(jìn)一步的解構(gòu) —— 解構(gòu)式賦值。
來自 Rust 1.59 版本之后更進(jìn)一步的 變量綁定 。—— 左值 可以使用 元組、切片、結(jié)構(gòu)體模式。
struct Struct {
e: i32
}
fn test_let_jiegou() {
let (z,r,y,mut reach): (char,char,char,i32) = ('a', 'a', 'c', 100);
println!("{} {} {} {}", z,r,y,reach);
reach = 111;
assert_eq!(111,reach);
// 解構(gòu)式賦值
let (a,b,c,d,e );
(a,b) = (11,22);
[c,..,d,_] = [1,2,3,4,5,6,7,8,9];
Struct {e,..} = Struct {e: 10};
println!("{} {} {} {} {} ", a,b,c,d,e );
}
fn main() {
test_let_jiegou();
}
執(zhí)行結(jié)果入下:
![[Pasted image 20230615214954.png]]
在我們使用 形如 ? ? [c,..,d,_]
的格式時(shí), 最后的 _
實(shí)際是代稱,當(dāng)我們使用占位之后,我們的值也對應(yīng)的修改。? ? [c,..,d,_,_]
這時(shí),我們的d 值變更為7。 這里于最后兩位處的值相同。
變量和常量之間的差異
在 Rust 中 常量值的定義 直觀感受 有點(diǎn)類似于 C++ 中的 宏定義的。
在c++ 中:
#define MAX_POINTS = 100000;
在Rust 中
const MAX_POINTS: u32 =100_000;
變量的值不能更改可能讓你想起其他另一個(gè)很多語言都有的編程概念:常量(constant)。與不可變變量一樣,常量也是綁定到一個(gè)常量名且不允許更改的值,但是常量和變量之間存在一些差異:
- 常量不允許使用?
mut
。常量不僅僅默認(rèn)不可變,而且自始至終不可變,因?yàn)槌A吭诰幾g完成后,已經(jīng)確定它的值。 - 常量使用?
const
?關(guān)鍵字而不是?let
?關(guān)鍵字來聲明,并且值的類型必須標(biāo)注。
我們將在之后 介紹,因此現(xiàn)在暫時(shí)無需關(guān)心細(xì)節(jié)。
下面是一個(gè)常量聲明的例子,其常量名為?MAX_POINTS
,值設(shè)置為?100,000
。(Rust 常量的命名約定是全部字母都使用大寫,并使用下劃線分隔單詞,另外對數(shù)字字面量可插入下劃線以提高可讀性):
常量可以在任意作用域內(nèi)聲明,包括全局作用域,在聲明的作用域內(nèi),常量在程序運(yùn)行的整個(gè)過程中都有效。對于需要在多處代碼共享一個(gè)不可變的值時(shí)非常有用,例如游戲中允許玩家賺取的最大點(diǎn)數(shù)或光速。
在實(shí)際使用中,最好將程序中用到的硬編碼值都聲明為常量,對于代碼后續(xù)的維護(hù)有莫大的幫助。如果將來需要更改硬編碼的值,你也只需要在代碼中更改一處即可。
總結(jié):
- rust 中使用了兩個(gè)不同的關(guān)鍵字 區(qū)分常量和變量, 不同于C++ ,const 和 let 具備同等的權(quán)重,const 不必作為修飾詞限定類型聲明。
變量遮蔽
所謂變量遮蔽,是指同名的變量在重定義時(shí),后面的變量會頂替掉前面的變量。
這種頂替是從內(nèi)存空間和內(nèi)存綁定層次實(shí)現(xiàn)的,因此,我們明確第二點(diǎn),rust 的類型是 經(jīng)過包裝的類型,內(nèi)部包括了 釋放和創(chuàng)建申請的相關(guān)操作。
在 Rust 中,drop 是一個(gè)特殊的 trait,用于定義當(dāng)一個(gè)值離開作用域時(shí)應(yīng)該執(zhí)行的代碼。這個(gè) trait 可以用來實(shí)現(xiàn)資源管理,例如釋放內(nèi)存或關(guān)閉文件句柄。當(dāng)一個(gè)值被銷毀時(shí),Rust 會自動調(diào)用其 drop 方法,以確保資源被正確釋放。
所以rust 中的值都是封裝之后的類型么?內(nèi)部包含對應(yīng)的trait ,保證釋放合理
是的,Rust 中的值都是封裝之后的類型,內(nèi)部包含對應(yīng)的 trait,以確保資源被正確釋放。這種方式可以避免內(nèi)存泄漏和資源泄漏等問題,提高程序的可靠性和安全性。
所以let 重定義一個(gè)變量后,原來的同名變量將會調(diào)用對應(yīng)的drop 方式 釋放變量和值兩者的空間嗎?文章來源:http://www.zghlxwxcb.cn/news/detail-492744.html
是的,當(dāng)使用 let 重新定義一個(gè)變量時(shí),原來的同名變量將會被銷毀,其對應(yīng)的值也會被釋放。Rust 會自動調(diào)用其 drop 方法,以確保資源被正確釋放。這種方式可以避免內(nèi)存泄漏和資源泄漏等問題,提高程序的可靠性和安全性。文章來源地址http://www.zghlxwxcb.cn/news/detail-492744.html
到了這里,關(guān)于Rust 基礎(chǔ)入門 —— 變量綁定與解構(gòu)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!