1. Tuple(元組)
元組是一組可以包含不同型別的資料集合,使用小括號 ()。可以用索引存取元素,或是解構 (destructuring)。
fn main() {
let tup: (i32, f64, &str) = (500, 6.4, "hello");
// 用索引存取
println!("tup.0 = {}, tup.1 = {}, tup.2 = {}", tup.0, tup.1, tup.2);
// 解構
let (x, y, z) = tup;
println!("x = {}, y = {}, z = {}", x, y, z);
}
輸出:
tup.0 = 500, tup.1 = 6.4, tup.2 = hello
x = 500, y = 6.4, z = hello
2. Struct(結構體)
Struct 可以更有意義地為資料命名,分為三種形式:一般結構、tuple 結構、單元結構。
struct Person {
name: String,
age: u8,
}
fn main() {
let p1 = Person {
name: String::from("Alice"),
age: 30,
};
println!("{} is {} years old", p1.name, p1.age);
}
輸出:
Alice is 30 years old
struct Color(i32, i32, i32);
fn main() {
let black = Color(0, 0, 0);
println!("({}, {}, {})", black.0, black.1, black.2);
}
輸出:
(0, 0, 0)
struct Marker;
fn main() {
let _m = Marker;
}
3. Struct 與函數搭配
通常會為 struct 寫建構函數,並透過借用(&)來避免所有權轉移:
struct Rectangle {
width: u32,
height: u32,
}
// 這裡參數用 &Rectangle,而不是直接 Rectangle
// 因為我們只需要讀取資料,不需要拿走所有權
fn area(rect: &Rectangle) -> u32 {
rect.width * rect.height
}
fn main() {
let rect = Rectangle { width: 30, height: 50 };
println!("The area is {}", area(&rect));
// rect 在這裡仍然可用,因為只是借用
println!("Rectangle is {}x{}", rect.width, rect.height);
}
輸出:
The area is 1500
Rectangle is 30x50
4. 學習心得與補充
今天學到的 tuple 和 struct 讓我感覺 Rust 在資料組織上設計得很靈活。Tuple 適合快速打包不同型別的值,但要用 .0、.1 來取值有點抽象,如果數據有意義,通常會改用 struct。struct 能替每個欄位命名,讓資料更清楚。這讓我想到前幾天在用變數和函數參數時,如果數值多起來會搞混,但有了 struct 就能把相關的資料包在一起,讓程式更有結構。Tuple struct 和單元結構則提供了更多特殊用法,雖然現在還沒有遇到必須用 tuple struct 或單元結構的情況,但我覺得知道它們的存在很重要,因為它們讓 Rust 的型別系統更靈活,也幫我建立了資料要怎麼被組織起來的不同思考方式。