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.
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ềTextStylevớiboldđược đặt thànhfalse,italicđược đặt thànhfalsevàsizeđược đặt thành12set_bold: nhận&mut selfvà một giá trịbool, đặt trường bold rồi trả về&mut Selfđể gọi nối tiếpset_italic: nhận&mut selfvà một giá trịbool, đặt trường italic rồi trả về&mut Selfđể gọi nối tiếpset_size: nhận&mut selfvà 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 (
truehoặcfalse) - Dòng thứ hai: cài đặt italic (
truehoặcfalse) - 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}
}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