Rust 內建豐富的原生型別(Primitives),主要分為純量型別與複合型別兩大類。
(一) 純量型別(Scalar Types)
代表單一獨立的值,包含 6 種:
- 有號整數:
i8、i16、i32、i64、i128、isize(長度配合系統指標大小) - 無號整數:
u8、u16、u32、u64、u128、usize(長度配合系統指標大小) - 浮點數:
f32、f64 - 字元 char:儲存 Unicode 純量值(如
'a'、'α'、'∞'),每個字元佔用 4 位元組 - 布林 bool:僅有兩個取值
true、false - 單元型別 ():唯一的值是空元組
()。雖然外觀是元組,但僅存放單一值,不屬於複合型別。
(二) 複合型別(Compound Types)(後續章節會學習)
由多個值組合而成:
- 陣列:範例
[1, 2, 3] - 元組:範例
(1, true)
1) 變數型別標註方式
所有變數都可以手動指定型別。數值型別額外支援後綴標註;若未標註則使用預設型別:
- 整數預設:
i32 - 浮點數預設:
f64
Rust 也能依據程式上下文自動推導型別。
2) 變數型別
1. 明確標註型別
直接在變數名稱後以 : 型別 指定型別,適用於所有變數。
fn main() {
let isOpen: bool = true;
let price: f64 = 1.0;
}Code language: JavaScript (javascript)
上面範例中,isOpen 和 price 是變數,後方的 : 型別名稱,就是在變數後明確宣告該變數的型別。
2. 數值後綴標註
在數值後加上型別後綴來指定數值型別,僅能使用在數字後。
fn main() {
let an_integer = 5i32;
}Code language: JavaScript (javascript)
這次沒有透過 : 指定變數型別,而是在賦值數字時,以 i32 指定為 32 位元整數型別。
3. 型別預設規則
完全不做任何標註、後綴時,編譯器會使用預設型別:
- 整數字面量 → 預設
i32 - 浮點數字面量 → 預設
f64
fn main() {
let default_float = 3.0; // 自動為 f64
let default_integer = 7; // 自動為 i32
}Code language: JavaScript (javascript)
4. 上下文型別推導
編譯器可依據後續程式碼自動推斷變數真實型別,不用手動標註。
fn main() {
let mut inferred_type = 12;
inferred_type = 4294967296i64; // 由這一行推導型別為 i64
}Code language: JavaScript (javascript)
可變變數 & 變數特性
1 可變變數
以關鍵字 mut 修飾的變數,值可以被修改。
fn main() {
let mut mutable = 12;
mutable = 21; // 合法,修改數值
}Code language: JavaScript (javascript)
2 型別不可變更
變數一旦確定型別,整個程式執行期間都無法更改,若賦予其他型別的值會直接編譯錯誤。
fn main() {
let mut mutable = 12;
mutable = 21; // 合法,修改數值
mutable = true; // 錯誤:原本型別為 i32,不能指派布林值 bool
}Code language: JavaScript (javascript)
C:\Users\Jack\Desktop\rustdemo>rustc hello.rs
error[E0308]: mismatched types
--> hello.rs:5:12
|
3 | let mut mutable = 12;
| -- expected due to this value
4 | mutable = 21; // 合法,修改數值
5 | mutable = true; // 錯誤:原本型別為 i32,不能指派布林值 bool
| ^^^^ expected integer, found `bool`
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0308`.Code language: JavaScript (javascript)
注意
在 Rust 中,變數的值預設是不可變的,如果希望能夠修改,就必須加上 mut 關鍵字,這點和其他程式語言不太一樣。
例如下面這段程式:在其他語言很常見,但在 Rust 會直接報錯
fn main() {
let mutable:i32 = 12;
mutable = 21; // 合法,修改數值
}Code language: JavaScript (javascript)
編譯錯誤
C:\Users\Jack\Desktop\rustdemo>rustc hello.rs
error[E0384]: cannot assign twice to immutable variable `mutable`
--> hello.rs:4:2
|
3 | let mutable:i32 = 12;
| ------- first assignment to `mutable`
4 | mutable = 21; // 合法,修改數值
| ^^^^^^^^^^^^ cannot assign twice to immutable variable
|
help: consider making this binding mutable
|
3 | let mut mutable:i32 = 12;
| +++
warning: variable `mutable` is assigned to, but never used
--> hello.rs:3:6
|
3 | let mutable:i32 = 12;
| ^^^^^^^
|
= note: consider using `_mutable` instead
= note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
warning: value assigned to `mutable` is never read
--> hello.rs:4:2
|
4 | mutable = 21; // 合法,修改數值
| ^^^^^^^^^^^^
|
= help: maybe it is overwritten before being read?
= note: `#[warn(unused_assignments)]` (part of `#[warn(unused)]`) on by default
error: aborting due to 1 previous error; 2 warnings emitted
For more information about this error, try `rustc --explain E0384`.Code language: JavaScript (javascript)
3 變數遮蔽(Shadowing)
重複使用 let 宣告同名變數,會遮蔽舊的變數;兩者是完全獨立的變數,型別可以不同。
fn main() {
let mutable = 12;
let mutable = true; // 遮蔽上方 i32 型別的變數,新變數型別為 bool
}Code language: JavaScript (javascript)
複合型別:陣列 & 元組
1. 陣列
- 語法格式:
[元素型別; 長度],型別、長度皆固定,所有元素型別必須相同。
let my_array: [i32; 5] = [1, 2, 3, 4, 5];Code language: JavaScript (javascript)
2. 元組
- 使用
()包圍,可存放多個不同型別的值。
let my_tuple = (5u32, 1u8, true, -5.04f32);Code language: JavaScript (javascript)