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> và 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!