Các kiểu generic trong Rust

Generic trong Rust giúp bạn giảm footprint và tăng độ mạnh của code. Dưới đây là các kiểu generic trong Rust mà bạn cần biết.

Lập trình với Rust

Phát triển ứng dụng luôn có nhiều bất ngờ, mà có thể dẫn tới lỗi, nhất là khi các hàm bạn dùng chấp nhận những kiểu đối số cụ thể. Để tránh điều đó, bạn có thể dùng Generic. Nó cung cấp tính năng tạo class, chức năng và cấu trúc dữ liệu để bạn làm việc với các kiểu khác nhau.

Dùng generic, bạn có thể tạo và xác định những thuật toán, cấu trúc dữ liệu có thể hoạt động trên nhiều kiểu mà không cần viết code phức tạp, đồng thời, triển khai cho từng loại. Generic cải thiện tính khả dụng và hiệu quả của code trong khi duy trì sự an toàn và năng suất.

Sử dụng các kiểu generic trong Rust

Kiểu generic của Rust có thể tương tác với những kiểu dữ liệu Rust khác. Bạn sẽ xác định các kiểu generic với dấu ngoặc nhọn (<>), được theo sau bởi hai tham số trở lên.

Đây là một định nghĩa struct chung, nhận hai tham số kiểu generic:

struct Point<T, U> {
    // T and U are generic type parameters that the x and y fields will
    // assume on instantiation
    x: T,
    y: U,
}

Trong struct, T và U là các tham số kiểu generic.

Bạn có thể hay tham số kiểu generic bằng kiểu dữ liệu bất kỳ khi cài đặt:

fn main() {
    let my_point = Point { x: String::from("hello"), y: String::from("world") };

    println!(
       "The x value of my_point is {} and the y value is {}.",
       my_point.x,
       my_point.y
   );
}

Biến my_point là một phiên bản struct Point được khởi tạo bằng các kiểu string. Trình biên dịch Rust suy ra các loại cụ thể của T và U dựa trên giá trị lúc khởi tạo.

Biến lập trình trong Rust

Trait bound của các kiểu generic

Những kiểu generic trong Rust có thể dùng giới hạn để đảm bảo độ an toàn của kiểu. Những đặc điểm này là bộ sưu tập phương thức mà kiểu có thể triển khai những hành vi cụ thể đã được định nghĩa cho trait.

Trait bound chỉ định một kiểu generic phải thực hiện một hoặc nhiều trait. Đây là ví dụ của một hàm generic trả về giá trị lớn hơn của hai giá trị với trait bound nhằm đảm bảo các kiểu được so sánh chạy đúng trait của nó:

// Maximum là trait xác định phương thức đánh giá giá trị tố đa của hai kiểu
trait Maximum {
    fn max(self, other: Self) -> Self;
}

// Triển khai trait `Maximum` trait cho tất cả các kiểu chạy
// `PartialOrd` trait.
impl<T: PartialOrd> Maximum for T {
    fn max(self, other: Self) -> Self {
        // return `self` if it is greater than `other`; otherwise, return
       // `other.`
        if self > other {
            self
        } else {
            other
        }
    }
}

fn main() {
    let a = 5;
    let b = 10;
    let largest = Maximum::max(a, b);
    println!("The largest value is {}", largest);
}

Trait Maximum có phương thức max, trả về số lớn hơn của hai giá trị cùng loại. Bất kỳ kiểu trait PartialOrd đều thực hiện trait Maximum.

Phương thức max tính hai giá trị của kiểu Self - tham chiếu tới kiểu chạy trait Maximum - và so sánh các giá trị.

Hàm main so sánh hai biến bằng phương thức max và in số lớn nhất.

Những kiểu generic trong Rust

Trên đây là những điều bạn cần biết về generic của Rust. Hi vọng bài viết giúp bạn lập trình tốt hơn.

Thứ Hai, 10/04/2023 09:44
52 👨 196
0 Bình luận
Sắp xếp theo