這里來聊一下Rust的變量聲明鞋屈,以及基本的數(shù)據(jù)類型范咨。
可變性
與其他編程語言很不同的一點(diǎn)是,Rust 的變量默認(rèn)是不可變的厂庇。
let x = 5;
x = 6;
這一步編譯會(huì)報(bào)錯(cuò)渠啊,因?yàn)閞ust的變量默認(rèn)是不可變的。
let mut x = 5;
x = 6;
在變量前加上 mut 則表示正在定義一個(gè)可變變量权旷,再改其值替蛉,就不會(huì)報(bào)錯(cuò)。
let x = 5;
let x = 6;
let x = "name";
1.定義一個(gè)變量拄氯,并將5這個(gè)值綁定給這個(gè)變量
2.重新使用let x
定義一個(gè)變量躲查,相當(dāng)于定義了一個(gè)新的變量,并且將6綁定給這個(gè)變量
3.再次使用let x
定義一個(gè)變量译柏,并且綁定一個(gè)不同類型的值
上面的三行代碼不會(huì)報(bào)錯(cuò)镣煮,在Rust中,這個(gè)操作叫做Shadowing
艇纺,中文翻譯是,舊的變量被新的變量隱藏了邮弹。
mut
與 Shadowing
的一個(gè)區(qū)別就是黔衡,Shadowing
相當(dāng)于創(chuàng)建了一個(gè)新的變量,所以可以使用完全不同類型的值
常量
- 聲明常量使用
const
腌乡,不使用let
盟劫,例如const MAX_NUM:u32 = 10000;
。 - 常量也
不能
使用mut
与纽。 - 常量必須明確數(shù)據(jù)類型 const
MAX_NUM:u32
= 10000; - 常量默認(rèn)
不可變
侣签,總是不可變
- 常量命名規(guī)范是
大寫字母加下劃線
基本數(shù)據(jù)類型
1. 整型
長度 | 有符號(hào) | 無符號(hào) |
---|---|---|
8-bit | i8 |
u8 |
16-bit | i16 |
u16 |
32-bit | i32 |
u32 |
64-bit | i64 |
u64 |
arch | isize |
usize |
- 有符號(hào)可存儲(chǔ)正值和負(fù)值,無符號(hào)只能存儲(chǔ)正值
- 有符號(hào)的存儲(chǔ)范圍是 -(2n-1) ~ (2n-1 - 1)急迂,n是位數(shù)影所。例如i8可以存儲(chǔ)的范圍是 -128 ~ 127
- 無符號(hào)的存儲(chǔ)范圍是 0 ~ (2n - 1),例如 u8 可以存儲(chǔ)的范圍是 0 ~ 255
- isize和usize依賴于運(yùn)行程序的計(jì)算機(jī)架構(gòu)僚碎,64位架構(gòu)上猴娩,它們就是64位,32位架構(gòu)上,它們就是32位
- 默認(rèn)類型是
i32
2. 浮點(diǎn)型
浮點(diǎn)型分為 f32
和 f64
卷中,默認(rèn)類型是 f64
3. 布爾型
布爾型只有兩個(gè)值 true
矛双,false
。let is_student: bool = false;
4. 字符型
字符型使用單引號(hào)蟆豫,例如 let c1: char = 'A';
议忽, let c1: char = '?';
。有一點(diǎn)要注意的是十减,Rust 的 char 類型代表了一個(gè) Unicode 標(biāo)量值(Unicode Scalar Value)栈幸,這意味著它可以比 ASCII 表示更多內(nèi)容。在 Rust 中嫉称,拼音字母(Accented letters)侦镇,中文、日文织阅、韓文等字符壳繁,emoji(繪文字)以及零長度的空白字符都是有效的 char 值。
5. 數(shù)組類型
每個(gè)元素的類型必須相同荔棉,數(shù)組的長度不能動(dòng)態(tài)增長或縮小闹炉。如果要修改數(shù)組中的某個(gè)值,則數(shù)組定義時(shí)要加 mut
才行
let a = [1, 2, 3 ,4 ,5];
let b: [i32: 10] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
let num1 = a[0];
let num2 = a[1];
6. 元祖類型
元祖類型是將多個(gè)相同或不同類型的值润樱,組合起來渣触。如果要修改元祖中的某個(gè)值,則元祖定義時(shí)要加mut
才行壹若。
let tup = (1, 2, 3, "haha", 'c', 'B');
let tup2: (i32, char, char) = (15, 'C', 'D');
// 這一句稱作解構(gòu)元祖(destructuring), 將tup2中的值分給賦值給x,y,z
let (x, y z) = tup2;
// 訪問元祖中的某個(gè)值
let x = tup2.0; // 訪問第0個(gè)值
let y = tup2.1; // 訪問第1個(gè)值