面试题答案
一键面试实现思路
- 分析结构体字段:仔细查看
ComplexData
结构体的各个字段,确定哪些是引用类型,哪些是值类型。对于值类型,可以直接使用其实现的Display
方法进行格式化。 - 处理引用类型:确保引用在
Display
实现期间保持有效,遵循 Rust 的借用规则。不能让引用生命周期短于Display
格式化操作所需的时间。 - 减少内存分配和拷贝:尽可能使用
write!
宏直接写入目标缓冲区,而不是创建中间字符串然后再拼接。对于引用类型,如果它们实现了Display
,直接调用其Display
实现,而不是先转换为其他类型。
关键代码片段
假设 ComplexData
结构体如下:
struct ComplexData<'a> {
value1: i32,
value2: &'a str,
value3: Vec<u8>,
}
实现 Display
trait:
use std::fmt;
impl<'a> fmt::Display for ComplexData<'a> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "value1: {}, value2: {}, value3: [", self.value1, self.value2)?;
for (i, byte) in self.value3.iter().enumerate() {
if i > 0 {
write!(f, ", ")?;
}
write!(f, "{}", byte)?;
}
write!(f, "]")
}
}
在上述代码中:
value1
是值类型,直接使用write!
写入。value2
是引用类型,同样直接使用write!
写入,确保引用在fmt
方法执行期间保持有效。value3
是Vec<u8>
,遍历并逐个写入,避免了不必要的内存分配和拷贝。