目錄
- 一、變量與常量
- 1.1 變量
- 1.2 常量
- 二、遮蔽
- 三、數據類型
- 3.1 標量類型
- 1. 整型
- 2. 浮點型
- 3. 布爾類型
- 4.字符類型
- 3.2 復合類型
- 1. 元組
- 2. 數組
- 四、函數
- 五、語句和表達式
- 六、函數的返回值
一、變量與常量
1.1 變量
??????在Rust中默認的變量是不可變的,如果修改其值會導致錯誤。
fn main(){let x = 3;x = 5; //error[E0384]: cannot assign twice to immutable variable `x`
}
定義變量時添加mut
關鍵字就能解決以上問題,例如let mut x = 3
1.2 常量
- 常量必須使用const定義,且類型必須被標注。
- 常量可以在任何作用域內進行聲明,包括全局作用域。
- 常量只可以綁定到常量表達式
- 常量使用全大寫字母,每個單詞之間用下劃線分隔
- 數字可以用_分隔,以增加可讀性
const MAX_POINTS:u32 100_000;
二、遮蔽
在Rust中,可以定義不同類型/相同類型的相同變量而不會報錯,例如
fn main(){let x = 3;let x = x + 5; //同為i32類型的xlet x = String::from("Hello"); //將x設置為String類型println!("{}", x);
}
三、數據類型
??????Rust是一門靜態類型語言,在編譯期內就必須知道變量的類型,因此將一個字符型的整數轉換成真正的整數型時,就必須顯式的定義類型。
fn main(){let x = "42".parse().expect("Not a number"); //let x:u32 = "42".parse().expect("Not a number"); 這是正確的println!("{}", x);
}
通過下面的報錯信息可以很明顯的知道應該如何修改源碼
3.1 標量類型
??????Rust有四種基本的標量類型:整型、浮點型、布爾型以及字符型
1. 整型
??????下表展示的Rust語言中的整型,后面的數字代表了所示用的位數,isize 和 usize 類型取決于程序運行的計算機體系結構。
長度 | 有符號類型 | 無符號類型 |
---|---|---|
8 位 | i8 | u8 |
16 位 | i16 | u16 |
32 位 | i32 | u32 |
64 位 | i64 | u64 |
128位 | i128 | u128 |
arch | isize | usize |
也可以按照下表中所示的任意形式來表示整型的字面量
數字字面量 | 示例 |
---|---|
十進制 | 98_222 |
十六進制 | 0xff |
八進制 | 0o77 |
二進制 | 0b1111_0000 |
字節 (僅限于 u8) | b’A’ |
整型溢出的問題
??????u8可以存放0~255的值,如果存放256則會發生整型溢出,在調試模式(debug)
下編譯,Rust會檢查溢出,在發布模式(release)
下構建時,Rust對于溢出的處理時采用取余的方式循環。比如在 u8 的情況下,256 變成 0,257 變成 1。
??????要顯式處理溢出的可能性,可以使用標準庫針對原始數字類型提供的以下一系列方法:
- 使用
wrapping_*
方法在所有模式下進行循環,例如 wrapping_add - 如果使用
checked_*
方法時發生溢出,則返回 None 值 - 使用
overflowing_*
方法返回該值和一個指示是否存在溢出的布爾值 - 使用
saturating_*
方法使值達到最小值或最大值
2. 浮點型
??????在 Rust 中浮點型數字也有兩種基本是 f32 和 f64,它們的大小分別為 32 位和 64 位。默認浮點類型是 f64,浮點型都是有符號的。
fn main(){let x = 83.1; //f64let y:f32 = 83.1; //f32
}
3. 布爾類型
??????Rust 中的布爾類型有兩個可能的值:true 和 false。布爾值的大小為 1 個字節。Rust 中的布爾類型可以使用 bool進行顯式的聲明。
fn main() {let t = true;let f: bool = false; // 顯式聲明為布爾型
}
4.字符類型
??????字符類型字面量用單引號引起來,Rust 的字符類型大小為 4 個字節,表示的是一個 Unicode 標量值,這意味著它可以表示的遠遠不止是 ASCII。標音字母,中文/日文/韓文的文字,emoji,還有零寬空格(zero width space)在 Rust 中都是合法的字符類型。
fn main() {let c = 'z';let z = '?';let heart_eyed_cat = '😻';
}
3.2 復合類型
??????Rust有兩種復合類型:元組(tuple)和數組(array)。
1. 元組
??????將多種類型的多個值組合到一個復合類型中的一種基本方式,元組的長度是固定的。
fn main(){let tup = (500, 30.1, "China"); //默認的類型創建元組let tup2:(i64, f32, bool) = (35, 34.1, true); //顯式創建元組let (x, y, z) = tup2; //將tup2中的三個值分別賦給x,y,zprintln!("{} {} {}", x, y, z); //訪問tup2的方式1println!("{} {} {}", tup2.0, tup2.1, tup2.2) //訪問tup2的方式1
}
2. 數組
數組的每個元素的元素類型必須相同,且數據的長度固定。
fn main(){let a = [1, 2, 3, 4, 5]; //定義默認i32的5個元素的數組,組內元素為1~5let b: [i64; 5] = [1, 2, 3, 4, 5]; //定義i64型的5個元素的數組,組內元素為1~5let c = [3; 5]; //長度為5,元組全為3,即相當于[3, 3, 3, 3, 3]for item in c{println!("item = {}", item) //循環輸出c內的元素}println!("a[0] = {}", a[0]); //單個訪問
}
四、函數
Rust的函數以fn
關鍵字開頭,函數和變量名中所有字母都是小寫并使用下劃線分隔單詞,函數參數必須指明類型。
fn another_function(x: i32, source: &str){println!("x = {}, source = {}", x, source);
}fn main(){another_function(32, "China");
}
五、語句和表達式
- 函數的函數體由一系列語句組成,也可以表達式結尾。
- 語句是執行一些操作但不返回值的指令。表達式(expression)計算并產生一個值。
fn main(){// let x = (let y = 6); //語句不返回值,因此bool得不到初始值let x = {let y = 6;y + 1 //不能加分號結尾,加分號后就成了語句}; //{}整體是表達式,返回值是y+1=7println!("x = {}", x);
}
六、函數的返回值
- rust并不對返回值命令,以
->
聲明返回值的類型。 - rust中的函數返回值等于
最后一個表達式
的值。 - 使用
return x
可以提前返回
fn get_return_value(x: i32) -> i32 {if x < 0{return -1;}x
}fn main() {let x = get_return_value(-1);let y = get_return_value(10);println!("{}, {}", x,y); //-1, 10
}