You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何反序列化经Debug trait格式化的Vec<Vec<usize>>?

解决方案

当然有不用手动逐字符解析的简便方案,下面给你两个实用的思路:

  • 用syn crate解析:Vec通过{:?}输出的格式,和Rust的嵌套数组字面量语法几乎完全一致,而syn本来就是用来解析Rust代码结构的工具,刚好能派上用场。示例代码如下:
use syn::{parse_macro_input, ExprArray};
use std::fs;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 读取文件内容
    let content = fs::read_to_string("data.txt")?;
    // 用syn解析外层数组
    let outer_array = parse_macro_input!(content as ExprArray);
    
    let mut result = Vec::new();
    for inner_expr in outer_array.elems {
        // 解析内层每个数组
        let inner_array = parse_macro_input!(inner_expr as ExprArray);
        let mut inner_vec = Vec::new();
        for num_expr in inner_array.elems {
            // 把每个数字字面量转换成usize
            let num_lit = parse_macro_input!(num_expr as syn::LitInt);
            inner_vec.push(num_lit.base10_parse()?);
        }
        result.push(inner_vec);
    }

    println!("解析结果: {:?}", result);
    Ok(())
}
  • 用debug_parser crate直接解析Debug输出:这个 crate 是专门针对Rust的Debug trait输出格式做的解析工具,用法更简洁,不需要关心Rust语法细节:
use debug_parser::DebugParser;
use std::fs;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let content = fs::read_to_string("data.txt")?;
    // 直接把字符串解析成目标类型
    let parsed_vec: Vec<Vec<usize>> = DebugParser::parse(&content)?;
    println!("解析结果: {:?}", parsed_vec);
    Ok(())
}

这两个方案都不需要自己写逐字符的解析逻辑,直接依赖现成的工具库就能完成反序列化。

内容的提问来源于stack exchange,提问作者Splines

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 09:01:12