MST
星途 面试题库

面试题:Rust中write!宏在复杂嵌套场景下的应用

给定一个包含嵌套Vec<Vec<i32>>类型的数据结构,比如`let data = vec![vec![1, 2], vec![3, 4]];`,使用`write!`宏将其格式化为一个类似矩阵的字符串输出,每行表示内部的Vec,每个元素之间用空格隔开,同时要正确处理格式化过程中的错误,并解释在这种场景下`write!`宏与`format!`宏使用上的区别。
39.7万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

代码实现

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!宏的区别

  1. 返回值
    • write!宏将格式化后的内容写入到一个实现了std::fmt::Write trait 的可变对象中,返回Result<(), std::fmt::Error>。这意味着在格式化过程中如果发生错误(比如底层的写入操作失败),可以通过Result类型来处理错误。
    • format!宏直接返回一个String,它内部调用write!,但是会在内部处理所有可能的std::fmt::Error,如果发生错误,程序会调用panic!。所以如果希望在格式化失败时优雅地处理错误,write!更合适;如果确定格式化不会失败,format!更简洁。
  2. 适用场景
    • write!适用于需要将格式化内容写入到特定的可变对象(如StringFile等实现了std::fmt::Write trait 的对象)并且需要处理错误的场景。
    • format!适用于简单地获取格式化后的字符串,不关心可能的格式化错误(因为会panic!),代码更简洁的场景。