Menu
CoddyTech

Nối chuỗi phương thức

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

Đến giờ, các phương thức có thể thay đổi của chúng ta đã sửa đổi struct và không trả về gì. Nhưng nếu chúng ta muốn gọi liên tiếp nhiều phương thức trên cùng một instance thì sao? Bằng cách trả về một tham chiếu đến self, chúng ta có thể gọi chuỗi phương thức (method chaining): một cách gọi trong đó nhiều lời gọi phương thức nối tiếp nhau trong cùng một biểu thức.

Điều quan trọng là các phương thức &mut self của bạn trả về &mut Self:

struct Config {
    debug: bool,
    timeout: u32,
}

impl Config {
    fn new() -> Config {
        Config { debug: false, timeout: 30 }
    }
    
    fn set_debug(&mut self, value: bool) -> &mut Self {
        self.debug = value;
        self
    }
    
    fn set_timeout(&mut self, seconds: u32) -> &mut Self {
        self.timeout = seconds;
        self
    }
}

Mỗi phương thức chỉnh sửa cấu trúc rồi trả về self: một tham chiếu có thể thay đổi đến cùng một đối tượng. Nhờ vậy, lời gọi phương thức tiếp theo có thể tiếp tục thao tác trên đối tượng đó ngay:

fn main() {
    let mut config = Config::new();
    
    config.set_debug(true).set_timeout(60);
    
    println!("Debug: {}, Timeout: {}", config.debug, config.timeout);
    // Đầu ra: Debug: true, Timeout: 60
}

Thay vì viết ba câu lệnh riêng biệt, chúng ta cấu hình mọi thứ trên một dòng liền mạch. Cách viết theo kiểu “builder” này đặc biệt hữu ích khi thiết lập các đối tượng có nhiều tùy chọn, giúp code ngắn gọn và dễ đọc hơn.

challenge icon

Thử thách

Dễ

Tạo một struct TextStyle với ba trường: bold (bool), italic (bool) và size (u32).

Thêm một khối triển khai cho TextStyle với các nội dung sau:

  • new: một hàm liên kết trả về TextStyle với bold được đặt thành false, italic được đặt thành false và size được đặt thành 12
  • set_bold: nhận &mut self và một giá trị bool, đặt trường bold rồi trả về &mut Self để gọi nối tiếp
  • set_italic: nhận &mut self và một giá trị bool, đặt trường italic rồi trả về &mut Self để gọi nối tiếp
  • set_size: nhận &mut self và một giá trị u32, đặt trường size rồi trả về &mut Self để gọi nối tiếp

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

  • Dòng đầu tiên: cài đặt bold (true hoặc false)
  • Dòng thứ hai: cài đặt italic (true hoặc false)
  • Dòng thứ ba: cỡ chữ (u32)

Tạo một TextStyle khả biến bằng new, sau đó dùng cách gọi nối tiếp các phương thức để áp dụng cả ba cài đặt trong một biểu thức. In trạng thái cuối cùng theo định dạng bên dưới.

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

Bold: {bold}, Italic: {italic}, Size: {size}

Tự làm thử

use std::io;

// TODO: Định nghĩa struct TextStyle tại đây


// TODO: Thêm khối triển khai cho TextStyle với:
// - hàm liên kết new()
// - phương thức set_bold()
// - phương thức set_italic()
// - phương thức set_size()


fn main() {
    let mut input = String::new();
    
    // Đọc thiết lập in đậm
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let bold: bool = input.trim().parse().expect("Invalid bool");
    input.clear();
    
    // Đọc thiết lập in nghiêng
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let italic: bool = input.trim().parse().expect("Invalid bool");
    input.clear();
    
    // Đọc thiết lập cỡ chữ
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let size: u32 = input.trim().parse().expect("Invalid u32");
    
    // TODO: Tạo TextStyle có thể thay đổi bằng new(), rồi gọi nối tiếp các phương thức
    // để áp dụng cả ba thiết lập trong một biểu thức
    
    
    // TODO: In kết quả theo định dạng: Bold: {bold}, Italic: {italic}, Size: {size}
    
}
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