Skip to content

Tự học Rust - Bài 17: Generics - Viết mã nguồn linh hoạt

TuanNDA
Published date:
Edit this post

Table of contents

Open Table of contents

1. Generics trong Hàm

Giả sử bạn muốn viết một hàm in ra một giá trị bất kỳ. Thay vì viết cho từng kiểu i32, &str, chúng ta dùng một tham số kiểu chung (thường được ký hiệu là T).

// T là viết tắt của Type
fn print_anything<T: std::fmt::Display>(item: T) {
    println!("{}", item);
}

2. Generics trong Structs

Chúng ta có thể định nghĩa các Struct chứa dữ liệu thuộc bất kỳ kiểu nào.

struct Point<T> {
    x: T,
    y: T,
}

fn main() {
    let integer_point = Point { x: 5, y: 10 };
    let float_point = Point { x: 1.0, y: 4.0 };
}

3. Generics trong Enums

Bạn đã thực sự sử dụng Generics qua Option<T>Result<T, E> mà chúng ta học ở bài trước rồi đó!

enum Option<T> {
    Some(T),
    None,
}

4. Hiệu năng của Generics (Monomorphization)

Bạn có thể lo lắng rằng dùng Generics sẽ làm chương trình chạy chậm hơn? Câu trả lời là Không.

Rust sử dụng một kỹ thuật gọi là Monomorphization. Khi biên dịch, Rust sẽ tự động tạo ra mã nguồn cụ thể cho từng kiểu dữ liệu mà bạn sử dụng. Vì vậy, hiệu năng của mã nguồn dùng Generics tương đương hoàn toàn với việc bạn viết mã riêng cho từng kiểu.


Lời kết Bài 17

Generics giúp mã nguồn của bạn vừa linh hoạt vừa an toàn. Ở bài tiếp theo, chúng ta sẽ tìm hiểu về Lifetimes - một khái niệm độc bản của Rust giúp trình biên dịch đảm bảo các tham chiếu luôn hợp lệ.

Hẹn gặp lại các bạn!

Previous
Tự học Rust - Bài 8: Mảng (Arrays) & Vectors
Next
Tự học Rust - Bài 7: Vòng lặp (Loops)