Menu
CoddyTech

Ôn tập: con trỏ thông minh mock

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 58 trên 61.

challenge icon

Thử thách

Dễ

Hãy tạo một con trỏ thông minh giả lập tên là SmartBox để minh họa cách các con trỏ thông minh thực sự của Rust hoạt động bên trong! Trình bao bọc của bạn sẽ dùng kiểu tổng quát, cho phép truy cập giá trị bên trong và tự động thông báo khi được dọn dẹp.

Bạn sẽ sắp xếp code trong hai tệp:

  • smart_box.rs: Định nghĩa một cấu trúc tổng quát công khai SmartBox<T> với một trường duy nhất tên là value có kiểu T. Triển khai hàm liên kết new để tạo một SmartBox và in thông báo tạo. Thêm phương thức get trả về tham chiếu đến giá trị bên trong. Cuối cùng, triển khai trait Drop để in thông báo dọn dẹp khi SmartBox ra khỏi phạm vi.
  • main.rs: Đưa module smart_box vào và minh họa SmartBox với hai kiểu khác nhau. Tạo một SmartBox<i32> chứa một số và một SmartBox<String> chứa văn bản, cả hai đều lấy từ đầu vào đã cho. In các giá trị bằng phương thức get. Thông báo Drop sẽ tự động xuất hiện khi các hộp ra khỏi phạm vi ở cuối main.

Khi tạo SmartBox, chương trình sẽ in:

SmartBox created

Khi truy cập giá trị, hãy in theo định dạng sau:

Value: {value}

Khi SmartBox bị hủy, chương trình sẽ in:

SmartBox dropped

Ví dụ, với đầu vào 42 và Hello:

SmartBox created
SmartBox created
Value: 42
Value: Hello
SmartBox dropped
SmartBox dropped

Lưu ý rằng cả hai hộp được tạo trước, sau đó các giá trị được truy cập, và cuối cùng cả hai bị hủy theo thứ tự ngược lại (tạo sau, hủy trước) khi main kết thúc.

Bạn sẽ nhận được hai đầu vào: một giá trị số nguyên (phân tích thành i32) và một giá trị chuỗi.

Tự làm thử

mod smart_box;

use smart_box::SmartBox;

fn main() {
    // Đọc dữ liệu đầu vào
    let mut input1 = String::new();
    std::io::stdin().read_line(&mut input1).expect("Failed to read line");
    let number: i32 = input1.trim().parse().expect("Failed to parse number");
    
    let mut input2 = String::new();
    std::io::stdin().read_line(&mut input2).expect("Failed to read line");
    let text = input2.trim().to_string();
    
    // TODO: Tạo một SmartBox<i32> chứa số đã nhập
    
    // TODO: Tạo một SmartBox<String> chứa văn bản đã nhập
    
    // TODO: In các giá trị bằng phương thức (method) get
    // Định dạng: "Value: {value}"
    
    // Các thông báo Drop sẽ tự động xuất hiện khi main kết thúc
}

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