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

30 Ngày học Rust - Day 21: Sức mạnh tối thượng của Advanced Traits

Day 21: Vượt ra ngoài ranh giới Trait cơ bản. Giải quyết xung đột Method trùng tên bằng Cú pháp đủ điều kiện (Fully Qualified Syntax) và khám phá Type Bí Truyền (Associated Types).

Day 21: Vượt ra ngoài ranh giới Trait cơ bản. Giải quyết xung đột Method trùng tên bằng Cú pháp đủ điều kiện (Fully Qualified Syntax) và khám phá Type Bí Truyền (Associated Types).

Traits Khi Va Chậm Quá Giới Hạn Sẽ Thế Nào?

Bài 12 đã khai sáng chân lý Trait cho lập trình cấu trúc chia sẻ (Shared Behavior). Nhưng thực tế Phũ Phàng luôn gõ cửa: Nếu bạn có 2 Trait Khác Nhau Dùng Chung Một Tên Hàm? Gã Struct lại Cấn Cả 2 Trait đó? Rust Xử Lý Gãy Gọng Đổ Máu Ra Sao? Đón xem nào.

Sự đan xen của Associated Types và Gắn Kết Traits

1. Type Bí Truyền - Associated Types

Thay vì xài Generics T cho Trait (Cách 1 là <T>), bạn Dùng Type Lồng Bên Trong (Associated Type). Hãy xem Interface Bộ Lọc Biến Iterator Chấn Động Thường Thấy của Các Vòng Lặp Do Rust Thiết Kế Phá Cách:

pub trait Iterator {
    // Khai Sinh 1 Lỗ Hổng Kép Mơ Hồ: GỌI LÀ ITEM
    type Item; 

    // Hàm Nhả Dòng Nước Mới Móc Lòi Trả Ra Khối Vuông ITEM ở Trển
    fn next(&mut self) -> Option<Self::Item>;
}

Tại Sao Bày Đặt Type Bí Truyền Bên Trong Lõi Interface Trait Chi ? Bởi Nếu bạn Dùng pub trait Iterator<T>, Tức Là Bản Struct Thằng Trì Chú Của Mày Được Phép Định Nghĩa NHIỀU Impl Iterator<u32> Rồi Cả Impl Iterator<String>. Rác! Dùng Kỹ Thuật Associated Type (Kẹp Lõi): CHỈ DUY NHẤT 1 Bản Impl Iterator ĐƯỢC PHÉP ÁP TRÊN MỖI STRUCT MÀ THÔI. Tính Nhất Quán Vô Mực Địch.

struct TrạmĐếm;
impl Iterator for TrạmĐếm {
    type Item = u32; // Chấm hết, Thằng Trạm Đếm Này Mãi Mãi Chỉ Nhả Ra Đạn u32!
    fn next(&mut self) -> Option<Self::Item> { Some(0) }
}

2. Default Type Parameters (Thế Cờ Generics Có Sẵn)

Lúc Add Phép Cộng Toán Học Bằng Trait Cộng Add, Có Chắc Luôn Phải Y Sắp Hai Chữ Cùng Kiểu Dính Tì Nhau Mới Ghép Toán Học? Không.

// RHS (Right Hand Side) Mặc Vạch Bằng Đại Từ Self (Bản thân tui)
trait Add<RHS=Self> { 
    type Output;
    fn add(self, rhs: RHS) -> Self::Output;
}

Lấy Dạng Mặt Trăng Ghép Toán Tọa Độ Mặt Lỗ Trống Của Sao Quả Tạ. Nếu Gọi Add<Millimeters>, Kiểu Trái Trôn Đã Lệnh Cộng Rạch Giao Giao Dục Hai Hãng Đơn Vị Đo Lường Trái Khóe Cực Siêu Ngầu. Đỡ Tốn Chữ Khi Thấy Trùng Chặp.

3. Cứu Cánh Nhồi Lệnh Đè Nép: Cú Pháp Định Danh Hoàn Thiện (Fully Qualified Syntax)

Điều Kiện Lỗi Nhục Bã Thất Nhất:

trait PhiCong { fn bay(&self); }
trait Chim { fn bay(&self); }

struct Nguoi;

impl PhiCong for Nguoi { fn bay(&self) { println!("Nói Với Trạm, Bật Động Cơ Cất Cánh"); } }
impl Chim for Nguoi { fn bay(&self) { println!("Móc Dây Chuyền Có Cánh Lá Vỗ Vỗ Như Điên"); } }
impl Nguoi { fn bay(&self) { println!("Đạp xe té xuống vực bay thẳng xuống đáy"); } }

fn main() {
    let tieu_nam = Nguoi;
    // Tự Rống Cục Bay, Nó Chạy cái Nào?
    tieu_nam.bay(); // => Rust Nhận Luôn Và In ƯU TIÊN HÀM GỐC CỦA STRUCT : Đạp xe Mất Răng.
}

Nhưng Nếu Khách Bắt Gọi Lệnh Bay Theo Nét Của Kẻ Bay PhiCong? Móc Ngoặt Bạo Lực Gọi Nhạc Bóp Mặt Trận Hoàn Tất:

PhiCong::bay(&tieu_nam);
Chim::bay(&tieu_nam);

// THẬM CHÍ, Gọi Hàm Liên Kết KHÔNG CÓ CHỮ &self (Ví dụ: Trait XeMay có Hàm `xe_gi()`)
// <Nguoi as XeMay>::xe_gi(); // Ép Kẻ Struct Nguoi Nôn Gọi Mặt Trận Giác Xe Hơi.

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

Supertraits là cái gì Tỏ Vẻ Nguy Tốn Thế?

Lấy Một ví Dụ Nhá! Bạn Viết Lên Trait “Tính Năng Mạ Vàng Bóng Bẩy Giao Diện” OutlinePrint. Bạn Chỉ Muốn NHỮNG THẰNG NÀO CÓ SẴN CHỨC NĂNG IN RA CHỮ CƠ BẢN (Display) Mới Được Ký Luật Trát Dán Dấu Mạ Vàng Của Phụ Thuộc Bạn! Thế Là Ban Hành Dấu Su-Pe-Tờ-Rait: trait OutlinePrint: fmt::Display { }. Xong. Hàm Nghĩa: Mày Chỉ Có Quyền Áp Lớp Vàng Này Khi Mày Đã Cót Lõi Vỏ Thép Cơ Nhận Dữ Liệu String Tròn Hảo Rùi. Ràng Buộc Luật Liên Tu Vạch Sáng Tỏa Cực Dễ Hiểu Ở Các Thư Viện Rust.


Sẵn sàng cho Ngày 22? Nghỉ Ngơi Quá Đủ Cho Bộ Não Bình Yên Ứng Mộng Lập Trình. Ngài Trình Biên Dịch Sẽ Bị Chúng Ta Chặn Cửa Rút Nạn Ống Xi Lanh Che Chở Bàng Sắt, Vọt Sang Vùng “Tà Đạo Địa Ngục” Đỉnh Cấp Hack Pointer C/C++ Mép Cạnh RAM Raw Bằng Khu Vực Gầm Đạn Của Thế Kỉ: [Day 22: Unsafe Rust - Ném Bỏ Luật Chơi An Toàn].

Chuỗi bài viết

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

Phần 21 / 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 »