方法链式调用
本课属于 Coddy Rust 学习旅程的“面向对象编程”单元。第 6 课,共 61 课。
到目前为止,我们的可变方法都修改了结构体,并且不返回任何内容。但如果我们想在同一个实例上连续调用多个方法,该怎么办?通过返回对 self 的引用,我们就能实现方法链式调用:这是一种将多个方法调用串联成一个表达式的模式。
关键在于让你的 &mut self 方法返回 &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
}
}
每个方法都会修改结构体,然后返回 self:一个指向同一实例的可变引用。这样,下一次方法调用就能立即继续对它进行操作:
fn main() {
let mut config = Config::new();
config.set_debug(true).set_timeout(60);
println!("Debug: {}, Timeout: {}", config.debug, config.timeout);
// 输出:Debug: true, Timeout: 60
}
我们不必写三条单独的语句,而是把所有内容配置在一条连贯的语句中。这种“构建器式”模式在设置包含许多可选选项的对象时尤其有用,能让代码更简洁易读。
挑战
简单创建一个包含三个字段的 TextStyle 结构体:bold(bool)、italic(bool)和 size(u32)。
为 TextStyle 添加一个实现块,包含以下内容:
new:一个关联函数,返回一个TextStyle,其中bold设置为false,italic设置为false,size设置为12set_bold:接收&mut self和一个bool值,设置 bold 字段,并返回&mut Self以便链式调用set_italic:接收&mut self和一个bool值,设置 italic 字段,并返回&mut Self以便链式调用set_size:接收&mut self和一个u32值,设置 size 字段,并返回&mut Self以便链式调用
你会收到三个输入:
- 第一行:粗体设置(
true或false) - 第二行:斜体设置(
true或false) - 第三行:字体大小(u32)
使用 new 创建一个可变的 TextStyle,然后使用方法链式调用,在单个表达式中应用这三项设置。按照下面所示的格式打印最终状态。
预期输出格式:
Bold: {bold}, Italic: {italic}, Size: {size}亲手试试
use std::io;
// TODO: 在这里定义 TextStyle 结构体
// TODO: 为 TextStyle 添加实现块,包含:
// - new() 关联函数
// - set_bold() 方法
// - set_italic() 方法
// - set_size() 方法
fn main() {
let mut input = String::new();
// 读取粗体设置
io::stdin().read_line(&mut input).expect("Failed to read line");
let bold: bool = input.trim().parse().expect("Invalid bool");
input.clear();
// 读取斜体设置
io::stdin().read_line(&mut input).expect("Failed to read line");
let italic: bool = input.trim().parse().expect("Invalid bool");
input.clear();
// 读取字号设置
io::stdin().read_line(&mut input).expect("Failed to read line");
let size: u32 = input.trim().parse().expect("Invalid u32");
// TODO: 使用 new() 创建可变的 TextStyle,然后通过方法链
// 在一个表达式中应用全部三项设置
// TODO: 按以下格式打印结果:Bold: {bold}, Italic: {italic}, Size: {size}
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Rust 在线编译器