代码实现
use std::fmt::Write;
fn format_matrix(data: &[Vec<i32>]) -> Result<String, std::fmt::Error> {
let mut result = String::new();
for row in data {
for (i, num) in row.iter().enumerate() {
if i > 0 {
write!(result, " ")?;
}
write!(result, "{}", num)?;
}
writeln!(result)?;
}
Ok(result)
}
使用示例
fn main() {
let data = vec![vec![1, 2], vec![3, 4]];
match format_matrix(&data) {
Ok(s) => println!("{}", s),
Err(e) => eprintln!("Formatting error: {}", e),
}
}
write!
与format!
宏的区别
- 返回值:
write!
宏将格式化后的内容写入到一个实现了std::fmt::Write
trait 的可变对象中,返回Result<(), std::fmt::Error>
。这意味着在格式化过程中如果发生错误(比如底层的写入操作失败),可以通过Result
类型来处理错误。
format!
宏直接返回一个String
,它内部调用write!
,但是会在内部处理所有可能的std::fmt::Error
,如果发生错误,程序会调用panic!
。所以如果希望在格式化失败时优雅地处理错误,write!
更合适;如果确定格式化不会失败,format!
更简洁。
- 适用场景:
write!
适用于需要将格式化内容写入到特定的可变对象(如String
、File
等实现了std::fmt::Write
trait 的对象)并且需要处理错误的场景。
format!
适用于简单地获取格式化后的字符串,不关心可能的格式化错误(因为会panic!
),代码更简洁的场景。