Trait là gì?
Thuộc phần Lập trình hướng đối tượng trong hành trình Rust của Coddy. Bài học 29 trên 61.
Generics cho phép bạn viết code hoạt động với mọi kiểu dữ liệu, nhưng đôi khi bạn cần đảm bảo một kiểu có thể làm một việc cụ thể. Đây là lúc đặc tính (trait) phát huy tác dụng.
Trait định nghĩa một tập hợp phương thức mà một kiểu phải triển khai. Hãy xem trait như một hợp đồng: bất kỳ kiểu nào “ký” vào hợp đồng này đều hứa cung cấp hành vi đã nêu. Nếu bạn từng dùng interface trong các ngôn ngữ khác, trait có mục đích tương tự.
Đây là cách bạn định nghĩa một trait:
trait Describable {
fn describe(&self) -> String;
}
Từ khóa trait mở đầu khai báo trait, theo sau là tên trait. Bên trong dấu ngoặc nhọn, bạn khai báo chữ ký phương thức, chỉ gồm tên, tham số và kiểu trả về, không có phần thân. Dấu chấm phẩy sau chữ ký cho biết đây là một yêu cầu, không phải phần triển khai.
Trait Describable này quy định: "Bất kỳ kiểu nào triển khai trait này đều phải cung cấp phương thức describe, nhận tham chiếu đến chính nó và trả về một String." Trait này không quan tâm phương thức hoạt động như thế nào, điều đó tùy thuộc vào từng kiểu triển khai nó.
Các trait trở nên mạnh mẽ khi nhiều kiểu khác nhau cùng triển khai một trait. Một Book, một Car và một Person đều có thể là Describable, mỗi kiểu cung cấp phần mô tả riêng. Trait đảm bảo tất cả đều có chung khả năng này.
Thử thách
DễHãy định nghĩa trait đầu tiên của bạn! Trait thiết lập một giao ước: bất kỳ kiểu nào triển khai trait đó đều phải cung cấp hành vi cụ thể. Bạn sẽ tạo trait Summarizable để các kiểu khác nhau có thể triển khai và tóm tắt chính chúng.
Bạn sẽ sắp xếp code trong hai tệp:
summary.rs: Định nghĩa một trait công khai tên làSummarizablevới một khai báo phương thức duy nhất:summarize(&self) -> String. Hãy nhớ, trong định nghĩa trait, bạn chỉ khai báo chữ ký phương thức bằng dấu chấm phẩy, không có phần thân. Điều này cho Rust biết rằng "bất kỳ kiểu nào triển khai trait này đều phải cung cấp phương thứcsummarizetrả về mộtString."main.rs: Đưa module summary vào và in ra thông báo xác nhận trait đã được định nghĩa. Vì bạn chưa học cách triển khai trait (đó là nội dung của bài học tiếp theo!), bạn chỉ cần kiểm tra xem trait có biên dịch chính xác hay không.
Trong tệp chính, hãy in ra thông báo sau để xác nhận định nghĩa trait của bạn hợp lệ:
Summarizable trait defined successfully!Thử thách này chỉ tập trung vào cú pháp định nghĩa trait: từ khóa trait, tên trait và cách khai báo chữ ký phương thức mà không cần triển khai. Trong bài học tiếp theo, bạn sẽ học cách để các struct triển khai trait này!
Tự làm thử
mod summary;
fn main() {
// TODO: In ra thông báo xác nhận trait đã được định nghĩa
// Đầu ra mong đợi: "Summarizable trait defined successfully!"
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Phương thức và hành vi
Nhập môn khối triển khaiTham số selfPhương thức có thể thay đổiHàm liên kếtNhiều khối triển khaiNối chuỗi phương thứcÔn tập: thao tác với hình chữ nhật4Dự án: Thú cưng ảo
Định nghĩa thú cưngCho thú cưng ăn7Các trait tiêu chuẩn
Trait DebugTrait DisplayClone và CopyCác trait so sánh bằngÔn tập: Điểm có thể in ra2Tính đóng gói và module
Kiến thức cơ bản về moduleTừ khóa publicTrường riêng tưHàm lấy giá trịHàm thiết lập giá trịÔn tập: tủ khóa an toàn5Kiểu tổng quát
Cấu trúc tổng quátPhương thức tổng quátNhiều kiểu tổng quátHàm tổng quátÔn tập: điểm tọa độTự luyện tập: Trình biên dịch Rust online