Chuyển đến nội dung chính
Mô-đun 5 · Bài học 2 trong tổng số 210/14 trong khóa học~15 min
Bài học theo mô-đun (2/2)

Đặc điểm và giới hạn đặc điểm

Đặc điểm xác định hành vi mà một loại cụ thể có và có thể chia sẻ với các loại khác. Chúng ta có thể sử dụng các đặc điểm để xác định một tập hợp các phương thức đại diện cho một chức năng hoặc giao diện chung nhất định, tương tự như giao diện trong các ngôn ngữ lập trình khác.

Giới hạn đặc điểm cho phép chúng tôi chỉ định rằng loại chung phải triển khai một đặc điểm cụ thể, đảm bảo rằng các phương thức được yêu cầu có sẵn tại thời điểm biên dịch.


Xác định và thực hiện một đặc điểm

Để xác định một đặc điểm, chúng tôi sử dụng từ khóa trait theo sau là chữ ký của các phương thức mà các loại triển khai phải xác định:

Rust
pub trait Summary {
    fn summarize(&self) -> String;
}

Để triển khai một đặc điểm trên một loại cụ thể, chúng tôi sử dụng cú pháp impl TraitName for TypeName:

Rust
pub struct NewsArticle {
    pub headline: String,
    pub content: String,
}

impl Summary for NewsArticle {
    fn summarize(&self) -> String {
        format!("{}", self.headline)
    }
}

Giới hạn tính trạng

Khi viết các hàm chung, chúng ta có thể hạn chế các tham số loại để đảm bảo chúng triển khai một đặc điểm cụ thể. Cú pháp chuẩn là <T: Trait>:

Rust
pub fn notify<T: Summary>(item: &T) {
    println!("Notification: {}", item.summarize());
}

Ngoài ra, đối với các chữ ký phức tạp hơn, chúng ta có thể sử dụng mệnh đề where:

Rust
pub fn notify_advanced<T>(item: &T)
where
    T: Summary
{
    println!("Notification: {}", item.summarize());
}

Hãy tự mình thử

Bài tập 1: Đặc điểm tóm tắt

tập thể dục#rust.m5.l2.e1
Nỗ lực: 0Đang tải…

Xác định một đặc điểm có tên Tóm tắt chứa chữ ký phương thức fn summary(&self) -> String;. Tiếp theo, xác định một cấu trúc NewsArticle với trường tiêu đề thuộc loại Chuỗi và triển khai đặc điểm Tóm tắt cho trường đó để phương thức tóm tắt trả về giá trị của trường tiêu đề.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Xác định đặc điểm `Summary` và cấu trúc`NewsArticle`. Triển khai với`impl Summary cho NewsArticle`sao chép trường`self.headline.clone()`.

Giải pháp khả dụng sau 3 lần thử

Bài tập 2: Giới hạn đặc điểm với print_summary

tập thể dục#rust.m5.l2.e2
Nỗ lực: 0Đang tải…

Dựa vào mã từ bài tập trước, hãy xác định một hàm chung có tên print_summary<T> chấp nhận mục tham số thuộc loại &T. Áp dụng một đặc điểm bị ràng buộc để T phải triển khai đặc điểm Tóm tắt. Bên trong hàm, in kết quả được trả về bởi item.summarize().

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Sử dụng chữ ký `fn print_summary<T: Summary>(item: &T)`và gọi`item.summarize()`bên trong`println!`.

Giải pháp khả dụng sau 3 lần thử

Bài tập 3: Tính diện tích bằng tính chất

tập thể dục#rust.m5.l2.e3
Nỗ lực: 0Đang tải…

Xác định một đặc điểm có tên Khu vực bằng phương thức fn khu vực (&self) -> f64;. Tạo một Vòng tròn cấu trúc chứa trường bán kính loại f64 và triển khai đặc điểm Diện tích cho trường đó bằng cách tính diện tích (công thức: bán kính * bán kính * 3.14159).

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Xác định đặc điểm `Khu vực` và cấu trúc`Circle`. Thực hiện`diện tích(&self)` bằng cách sử dụng công thức diện tích hình tròn.

Giải pháp khả dụng sau 3 lần thử