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:
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:
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>:
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:
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
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 đề.
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
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().
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
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).
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ử