面试题答案
一键面试format!
宏
- 基本用法:
format!
宏用于创建一个新的String
,它接受一个格式化字符串和一系列参数。例如:
let num = 42; let s = format!("The number is: {}", num); println!("{}", s);
- 格式化字符串中使用占位符
{}
来指定参数的位置,还支持更复杂的格式化,如指定宽度、精度等。例如,format!("{:0>5}", 42)
会将数字42格式化为宽度为5,不足5位时在前面补0的字符串,结果为00042
。
- 性能特点:
format!
宏在内部会分配新的内存来存储格式化后的字符串。如果需要频繁调用format!
宏来生成临时字符串,可能会产生较多的堆内存分配开销,在性能敏感的场景下可能不太理想。
write!
系列宏
- 基本用法:
write!
宏用于将格式化后的数据写入实现了Write
trait的类型中,如String
、File
等。例如,将数据写入String
:
use std::fmt::Write; let mut s = String::new(); let num = 42; write!(&mut s, "The number is: {}", num).unwrap(); println!("{}", s);
- 还有
writeln!
宏,它与write!
类似,但是会在输出的末尾添加一个换行符。例如,writeln!(&mut s, "Another line");
。
- 性能特点:
write!
系列宏避免了每次都分配新的String
,而是复用已有的Write
实现的缓冲区。这在需要多次追加格式化数据到同一个字符串或其他可写对象时,能减少内存分配次数,从而在性能上优于format!
宏。
场景选择
- 优先选择
format!
的场景:- 当只需要生成一次性使用的字符串,且性能不是关键因素时,
format!
宏使用起来更简洁方便。例如,在简单的日志记录中,println!("{}", format!("Some log message with value: {}", value));
。
- 当只需要生成一次性使用的字符串,且性能不是关键因素时,
- 优先选择
write!
系列宏的场景:- 当需要多次追加格式化数据到同一个可写对象(如
String
),并且对性能有较高要求时,应优先选择write!
系列宏。比如在构建一个较大的字符串,需要多次拼接不同部分的格式化数据时,使用write!
可以减少内存分配,提高性能。
- 当需要多次追加格式化数据到同一个可写对象(如