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.
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ậnname: Stringvà trả về mộtPlayercóscoređược đặt thành0get_score: nhận&selfvà trả về điểm hiện tại dưới dạngu32
Khối impl thứ nhất: Hàm khởi tạo và truy vấn:
add_points: nhận&mut selfvàpoints: u32, cộng điểm vào điểm sốreset_score: nhận&mut selfvà đặt điểm số về0
Khối impl thứ hai: Thay đổi điểm số:
add_points: nhận&mut selfvàpoints: u32, cộng điểm vào điểm sốreset_score: nhận&mut selfvà đặ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
}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
1Phương thức và hành vi
Nhập môn khối triển khaiTham số selfPhương thức có thể thay đổiHàm liên kếtNhiều khối triển khaiNối chuỗi phương thứcÔn tập: thao tác với hình chữ nhật4Dự án: Thú cưng ảo
Định nghĩa thú cưngCho thú cưng ăn7Các trait tiêu chuẩn
Trait DebugTrait DisplayClone và CopyCác trait so sánh bằngÔn tập: Điểm có thể in ra2Tính đóng gói và module
Kiến thức cơ bản về moduleTừ khóa publicTrường riêng tưHàm lấy giá trịHàm thiết lập giá trịÔn tập: tủ khóa an toàn5Kiểu tổng quát
Cấu trúc tổng quátPhương thức tổng quátNhiều kiểu tổng quátHàm tổng quátÔn tập: điểm tọa độTự luyện tập: Trình biên dịch Rust online