· Phạm Thành Nam · Ngôn ngữ Rust · 4 phút đọc

30 Ngày học Rust - Day 12: Traits - Kẻ ban phát quyền năng và Lập pháp Hành vi

Day 12: Trait trong Rust là gì? Khám phá cách Rust vượt qua giới hạn của Interface truyền thống để định hình hành vi dùng chung giữa vô số các khối hình Types khác nhau.

Day 12: Trait trong Rust là gì? Khám phá cách Rust vượt qua giới hạn của Interface truyền thống để định hình hành vi dùng chung giữa vô số các khối hình Types khác nhau.

Traits: Bóng dáng của Interface nhưng hùng mạnh hơn

Trong thiết kế Phần mềm (vd Web Backend), chúng ta có hàng loại cấu trúc dữ liệu khác nhau. Một Bài Đăng Blog (Article) và một Đoạn Bình Luận (Tweet) là hai hình khối Struct cách biệt.

Nhưng ở trang Tổng Hợp, chúng ta cần một Cổng gọi Method in ra dòng tóm tắt (Summary) gọi được chung trên cả Bài viết lẫn Tweet mà không phát sinh lỗi. Trong C#, Go hay TS, nó gọi là Interface (Giao diện phương thức). Rust gọi Cơ chế siêu phàm này là Traits (Đặc diểm / Khí chất).

Sơ đồ Trait quy tụ các Struct khác nhau vào chung một bộ phương thức

1. Định nghĩa Luật và Áp Luật vào Struct

Bước 1: Ban hành một Bản Sắc Lệnh (Trait) khai báo hàm tóm tắt. Cấm ghi nội dung hàm rẽ nhánh.

pub trait Summary {
    // Chỉ có khuôn hàm, không có khối body
    fn summarize(&self) -> String; 
}

Bước 2: Buộc Cấu Hình Bài Viết của bạn học cách thực thi Luật này (Impl for):

pub struct BàiViết {
    pub tieu_de: String,
    pub tac_gia: String,
    pub noi_dung: String,
}

// Bắt khai báo Tóm Tắt (Summary) TRÊN Struct BàiViết
impl Summary for BàiViết {
    fn summarize(&self) -> String {
        format!("(Đọc ngay) {} viết bởi {}", self.tieu_de, self.tac_gia)
    }
}

Từ giờ, Biến gán Bài Viết sẽ thừa kế một Hành vi mở rộng bằng câu lệnh bai_viet.summarize().

2. Tác dụng vĩ đại: Ràng buộc Kiểu Parameter (Trait Bounds)

Điều khiến Hành động bên trên đáng tiền nhất nằm ở việc tạo Hàm Tổng Lập. Hãy viết một cái Hàm gọi Báo cáo:

// HÀM NÀY: Mày ném Cái con mịa gì vô cũng được, MIỄN LÀ thứ đó Đã kí khế ước Trait Summary
pub fn thong_bao_nong(item: &impl Summary) {
    println!("Tin mới nhận! {}", item.summarize());
}

Nếu bạn cố ném thử 1 Số Nguyên i32 vào hàm thong_bao_nong, Compiler chửi xối xả do Ngài Số Nguyên chưa bao giờ kí cái Luật Summary Của bạn. Đây được gọi là Trait Bounds (Hàng rào Đặc Tính).

3. Các Traits dựng sẵn nổi tiếng của Rust

Bạn không cần tự chế toàn bộ. Rustc cung cấp kho vũ khí siêu khổng lồ:

  • DisplayDebug: Biến Struct thành Đoạn Text In Phun Mực Ra Console.
  • Clone: Phép thuật Bóng phân thân Bộ Nhớ Memory RAM.
  • Drop: Thần Huỷ Diệt gọi lúc Cửa Sinh tử Bracket (}) nhắm lại.
  • EqPartialEq: Khả năng lấy Lệnh Toán học Ngang Hàng Lưỡi Dao So Sánh (Dấu ngã ==).

Câu hỏi thường gặp (FAQ)

Lệnh #[derive(...)] ma quỷ đặt trên đầu các Struct là gì?

Rust cung cấp công cụ tự động phát sinh thuật toán Trait cho bạn mang tên Macro Derive. Ví dụ dòng #[derive(Debug, Clone)] dán ở ngay trên chữ struct ToaDo báo hiệu cho Compiler: Trong lúc Build App, hãy thay ta viết giùm hàng trăm cái Lệnh Impl Clone Mặc định và Debug cho cái cục ToaDo này giùm! Bạn Tiết kiệm hàng giờ đồng hồ mổ não đập code rác.

”Trait Objects” khác gì Trait Bounds Generics?

Chữ impl Trait ở mục 2 ép Compiler sinh ra nhiều Phiên bản Hàm (Monomorphization ở Ngày 11) - tốc độ max. Nhưng Trait Object (Box<dyn Trait>) thì cho phép bạn gói BàiViết và Tweet xới trọn vào Cùng 1 MẢNG List Vector. Đổi lại khi ứng dụng chạy, nó sẽ bị trễ vài siêu Nano Giây để dò bảng con trỏ hàm ảo Vtable. Kén RAM hơn.


Sẵn sàng cho Ngày 13? Chặn vách núi cao tót nhất làm gẫy xương chân của 90% Dev chuyển từ Node JS qua học Rust chính là Bóng Đêm mang tên Lifetimes. Rửa mặt tỉnh não, sẵn sàng đối phó Boss cuôi The Borrow Checker vào Ngày mai: [Day 13: Lifetimes - Nỗi ám ảnh Không - Dangling Pointer].

Chuỗi bài viết

30 Ngày Trở Thành Rustacean Tinh Hoa

Phần 12 / 30

30 bài viết
  1. Phần 1 30 Ngày học Rust - Day 1: Lời chào thế giới và Vũ khí Cargo
  2. Phần 2 30 Ngày học Rust - Day 2: Biến, Bất biến (Mutability) và Shadowing
  3. Phần 3 30 Ngày học Rust - Day 3: Luồng điều khiển (Control Flow) và sức mạnh của Match
  4. Phần 4 30 Ngày học Rust - Day 4: Ownership - Khái niệm định hình cỗ thần khí Rust
  5. Phần 5 30 Ngày học Rust - Day 5: Khóa học nhặt đồ chung với References & Borrowing
  6. Phần 6 30 Ngày học Rust - Day 6: Đắp nặn dự án với Structs và Methods
  7. Phần 7 30 Ngày học Rust - Day 7: Quyền năng vô song của Enums và Pattern Matching
  8. Phần 8 30 Ngày học Rust - Day 8: Quản lý dự án với Packages, Crates và Modules
  9. Phần 9 30 Ngày học Rust - Day 9: Các bộ sưu tập chung (Vectors, Strings, Hash Maps)
  10. Phần 10 30 Ngày học Rust - Day 10: Trị dứt điểm Ác mộng Lỗi (Error Handling)
  11. Phần 11 30 Ngày học Rust - Day 11: Generics - Ma thuật Đa hình kiểu dữ liệu
  12. Phần 12 30 Ngày học Rust - Day 12: Traits - Kẻ ban phát quyền năng và Lập pháp Hành vi
  13. Phần 13 30 Ngày học Rust - Day 13: Vượt qua Boss cuối 'Lifetimes' - Sinh Mệnh Biến
  14. Phần 14 30 Ngày học Rust - Day 14: Tận diệt Bug từ trứng nước bằng Automated Tests
  15. Phần 15 30 Ngày học Rust - Day 15: Thực chiến Build Command Line App (CLI) đầu đời
  16. Phần 16 30 Ngày học Rust - Day 16: Functional Magic chốn trần gian (Closures & Iterators)
  17. Phần 17 30 Ngày học Rust - Day 17: Quyền năng của Smart Pointers
  18. Phần 18 30 Ngày học Rust - Day 18: Chinh phục Da luồng (Concurrency) - Cú đâm quyết định của Rust
  19. Phần 19 30 Ngày học Rust - Day 19: Tranh cãi Lập trình hướng đối tượng (OOP) trong Rust
  20. Phần 20 30 Ngày học Rust - Day 20: Mổ xẻ nghệ thuật Advanced Pattern Matching
  21. Phần 21 30 Ngày học Rust - Day 21: Sức mạnh tối thượng của Advanced Traits
  22. Phần 22 30 Ngày học Rust - Day 22: Về Phe Bóng Tối với Unsafe Rust
  23. Phần 23 30 Ngày học Rust - Day 23: Quyền năng của Đấng Tạo Hóa (Declarative Macros)
  24. Phần 24 30 Ngày học Rust - Day 24: Siêu Năng Lực Procedural Macros (Macro Thủ Tục)
  25. Phần 25 30 Ngày học Rust - Day 25: Xây dựng TCP Web Server Đa Luồng (Phần 1: Lõi Socket)
  26. Phần 26 30 Ngày học Rust - Day 26: Xây dựng TCP Web Server Đa Luồng (Phần 2: Bắn trả File HTML)
  27. Phần 27 30 Ngày học Rust - Day 27: Xây dựng TCP Web Server Đa Luồng (Phần 3: The Thread Pool)
  28. Phần 28 30 Ngày học Rust - Day 28: Xây dựng TCP Web Server Đa Luồng (Phần 4: Graceful Shutdown)
  29. Phần 29 30 Ngày học Rust - Day 29: Lên đỉnh Web Server Thực Chiến với Axum và Tokio
  30. Phần 30 30 Ngày học Rust - Day 30: Vượt Vọng Vàng - Đúc Kết Hành Trình Rustacean Tinh Hoa

Bình luận

Quay lại Blog

Bài viết liên quan

Xem tất cả bài viết »