Menu
CoddyTech

Nhiều khối triển khai

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

Rust cho phép bạn chia các phương thức của một struct thành nhiều khối impl. Bạn có thể đặt mọi thứ trong một khối duy nhất, nhưng tách chúng ra sẽ giúp code của bạn gọn gàng và dễ đọc hơn.

Đây là một struct có chức năng được chia thành hai khối triển khai:

struct BankAccount {
    balance: f64,
}

// Hàm khởi tạo và các truy vấn cơ bản
impl BankAccount {
    fn new(initial: f64) -> BankAccount {
        BankAccount { balance: initial }
    }
    
    fn balance(&self) -> f64 {
        self.balance
    }
}

// Các phương thức giao dịch
impl BankAccount {
    fn deposit(&mut self, amount: f64) {
        self.balance += amount;
    }
    
    fn withdraw(&mut self, amount: f64) {
        self.balance -= amount;
    }
}

Cả hai khối phối hợp với nhau liền mạch: Rust xem chúng như một khối duy nhất. Bạn có thể gọi bất kỳ phương thức nào, bất kể phương thức đó được định nghĩa trong khối nào:

fn main() {
    let mut account = BankAccount::new(100.0);
    account.deposit(50.0);
    println!("{}", account.balance()); // 150
}

Mẫu này đặc biệt hữu ích khi các struct của bạn ngày càng lớn. Bạn có thể nhóm các hàm khởi tạo lại với nhau, tách riêng các phương thức chỉ đọc khỏi các phương thức làm thay đổi dữ liệu, hoặc sắp xếp theo tính năng. Một struct có thể có bao nhiêu khối impl cũng được.

challenge icon

Thử thách

Dễ

Tạo một cấu trúc Player với hai trường: name (String) và score (u32).

Sắp xếp các phương thức của cấu trúc thành hai khối triển khai riêng biệt:

  • new: một hàm liên kết nhận name: String và trả về một Player có score được đặt thành 0
  • get_score: nhận &self và trả về điểm hiện tại dưới dạng u32

Khối impl thứ nhất: Hàm khởi tạo và truy vấn:

  • add_points: nhận &mut self và points: u32, cộng điểm vào điểm số
  • reset_score: nhận &mut self và đặt điểm số về 0

Khối impl thứ hai: Thay đổi điểm số:

  • add_points: nhận &mut self và points: u32, cộng điểm vào điểm số
  • reset_score: nhận &mut self và đặt điểm số về 0

Bạn sẽ nhận ba đầu vào:

  • Dòng thứ nhất: tên người chơi (String)
  • Dòng thứ hai: số điểm cần cộng ở vòng đầu tiên (u32)
  • Dòng thứ ba: số điểm cần cộng ở vòng thứ hai (u32)

Tạo một người chơi bằng Player::new, cộng điểm vòng đầu tiên, in điểm số, sau đó đặt lại điểm số, cộng điểm vòng thứ hai và in điểm số cuối cùng.

Định dạng đầu ra dự kiến:

{score_after_first_round}
{score_after_reset_and_second_round}

Tự làm thử

use std::io;

// TODO: Định nghĩa struct Player với các trường name (String) và score (u32)


// TODO: Khối impl thứ nhất: hàm khởi tạo và các phương thức truy vấn (new, get_score)


// TODO: Khối impl thứ hai: các phương thức thay đổi điểm (add_points, reset_score)


fn main() {
    let mut input = String::new();
    
    // Đọc tên người chơi
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let name = input.trim().to_string();
    
    // Đọc số điểm vòng đầu tiên
    input.clear();
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let first_round: u32 = input.trim().parse().expect("Invalid number");
    
    // Đọc số điểm vòng thứ hai
    input.clear();
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let second_round: u32 = input.trim().parse().expect("Invalid number");
    
    // TODO: Tạo người chơi bằng Player::new
    // TODO: Cộng điểm vòng đầu tiên và in ra tổng điểm
    // TODO: Đặt lại điểm về 0
    // TODO: Cộng điểm vòng thứ hai và in ra tổng điểm cuối cùng
}
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