Menu
CoddyTech

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.

challenge icon

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à Summarizable vớ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ức summarize trả về một String."
  • 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!"
    
}
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch Rust online