1.數(shù)據(jù)類型部分
1.1 整數(shù)類型
1.2 整數(shù)字面量
1.3 元組
元組使用
.
加索引的方式獲取各部分的值。
let x = (1,2,3);
let first = x.1;
1.4 數(shù)組
數(shù)組長度固定坊罢,每個數(shù)組元素類型都相同续担。數(shù)組空間在棧上分配。
1.5 函數(shù)
函數(shù)定義中必須注明參數(shù)的類型活孩。函數(shù)定義示例:
fn example(x : i32, y:i64) -> i32{
x+y
}
函數(shù)體最后一個表達(dá)式的值默認(rèn)為函數(shù)的返回值物遇,亦可用return
關(guān)鍵字提前返回。
1.6 表達(dá)式
表達(dá)式有返回值而語句沒有憾儒。代碼塊也是表達(dá)式询兴。i.e.
let y = {
let x = 1;
x + 1
}
上面的表達(dá)式最后一行沒有;
,它將返回x+1
的值起趾。若x+1
加上了分號诗舰,則她就變成了語句,不會返回值了训裆。
1.7 if 表達(dá)式
在rust語言中眶根,if分支判斷不是語句而是表達(dá)式。它會返回被命中的分支所返回的值边琉。
let y = if 1 == 1 {
5
}else {
6
};
如果想要接收if表達(dá)式返回的值属百,需注意每個arms返回的數(shù)值的類型都應(yīng)該相同,否則編譯會報錯变姨。
let y = if 1 == 1 {
5
}else {
"error"
};
//編譯后會報錯
error[E0308]: if and else have incompatible types
--> src/main.rs:2:13
|
2 | let y = if 1 == 1 {
| _____________^
3 | | 5
4 | | }else {
5 | | "hello"
6 | | };
| |_____^ expected integral variable, found &str
|
= note: expected type `{integer}`
found type `&str`
1.8 range類型:(1...4)
诸老。左閉右開。結(jié)合for循環(huán)使用钳恕,口味更佳:
for i in (1...4){
//do something...
}
2.所有權(quán)
2.1 所有權(quán)是用來管理堆上的數(shù)據(jù)的:
跟蹤哪部分代碼正在使用堆上的哪些數(shù)據(jù)别伏,最大限度的減少堆上的重復(fù)數(shù)據(jù)的數(shù)量,以及清理堆上不再使用的數(shù)據(jù)確保不會耗盡空間忧额,這些問題正是所有權(quán)系統(tǒng)要處理的厘肮。
2.2 所有權(quán)規(guī)則:
1.Rust 中的每一個值都有一個被稱為其 所有者(owner)的變量。
2.值有且只有一個所有者睦番。
3.當(dāng)所有者(變量)離開作用域类茂,這個值將被丟棄(此處丟棄指編譯器自動調(diào)用該類型的drop
方法釋放內(nèi)存及其他系統(tǒng)資源)。
2.3 棧與堆的區(qū)別:
- 棧上的數(shù)據(jù)需要在編譯是明確知道所需空間大型邢巩检;堆上的數(shù)據(jù)則不需要。
- 堆上的數(shù)據(jù)需要通過指針來訪問示启,因此訪問速度更慢兢哭;而棧的數(shù)據(jù)都在棧頂,且數(shù)據(jù)大小是已知的夫嗓,此外還能更好的利用局部性定理迟螺,因此訪問棧上的數(shù)據(jù)更快。
2.4 數(shù)據(jù)的移動:
對堆數(shù)據(jù)的變量進(jìn)行拷貝(賦值舍咖、函數(shù)傳參等操作)時矩父,舊的指針將失效,該操作稱為移動
:
let s = String::from("hello");
let s1 = s; //此時s將失效排霉。若繼續(xù)使用s窍株,編譯器將報錯!
擁有Copy
Trait 的類型攻柠,在進(jìn)行賦值后舊的變量不會失效(不移動球订,直接進(jìn)行深拷貝)。
2.4 引用(如何在并發(fā)場景下預(yù)防內(nèi)存釋放的沖突辙诞?辙售?)
- 類似于指向變量的指針。擁有引用的代碼塊不會獲取該變量的所有權(quán)飞涂,因此離開作用域時不會釋放指定的變量旦部。
- 在一個作用域中,不可變引用可以有多個较店,但是可變引用只能有一個士八。
- 在一個作用域中,不可變引用與可變引用不可以同時存在
- 引用必須是有效的梁呈。引用指向的值不能在引用之前被釋放婚度,否則編譯時會報錯。
2.5 slice官卡,一種特殊的引用蝗茁。允許引用集合類型的部分元素醋虏。
字符串引用聲明為&str
。字符串的字面量就是字符串slice哮翘,其含義為指向二進(jìn)制程序特定位置的slice颈嚼。字符串字面量是一個不可邊引用。從一個字符串獲取字符串引用的方式如下:
let s = String::from("Hello world");
let s1 = &s[1..2]; // 獲取只包含第二個字符的字符串slice
let s2 = &s[..3]; //獲取包含前三個字符的字符串slice
let s3 = &s[..]; //獲取包含整個字符串的字符串引用
除字符串外饭寺,其他集合類型也可以使用引用阻课,其性質(zhì)與字符串引用相同:
let s = [1,2,3,4,5];
let s1 = &s[1..2];