基礎型別

Rust 內建豐富的原生型別(Primitives),主要分為純量型別複合型別兩大類。

(一) 純量型別(Scalar Types)

代表單一獨立的值,包含 6 種:

  • 有號整數i8i16i32i64i128isize(長度配合系統指標大小)
  • 無號整數u8u16u32u64u128usize(長度配合系統指標大小)
  • 浮點數f32f64
  • 字元 char:儲存 Unicode 純量值(如 'a''α''∞'),每個字元佔用 4 位元組
  • 布林 bool:僅有兩個取值 truefalse
  • 單元型別 ():唯一的值是空元組 ()。雖然外觀是元組,但僅存放單一值,不屬於複合型別。

(二) 複合型別(Compound Types)(後續章節會學習)

由多個值組合而成:

  1. 陣列:範例 [1, 2, 3]
  2. 元組:範例 (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)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *