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

如何在Rust中使用toml-rs库捕获TOML文件中的所有表

解决toml-rs动态捕获所有顶层表的问题

你可以通过Serde的#[serde(flatten)]属性配合HashMap来实现动态捕获所有顶层表,无需手动添加每个用户字段。具体修改如下:

修改后的代码

use serde::Deserialize;
use std::collections::HashMap;
use toml;

#[derive(Debug, Deserialize)]
struct Config {
    active_users: Vec<String>,
    #[serde(flatten)]
    users: HashMap<String, User>,
}

#[derive(Debug, Deserialize)]
struct User {
    name: String,
}

fn main() {
    let toml_str = r#"
        active_users = ["john", "new2rust"]
        
        [john]
        name = "John Doe"
        
        [new2rust]
        name = "Jane Doe"
        
        [randomguy]
        name = "Rust Guy"
    "#;

    let decoded: Config = toml::from_str(toml_str).unwrap();
    println!("{:#?}", decoded);
}

关键说明

  • #[serde(flatten)]:这个属性会告诉Serde将所有未匹配到结构体显式字段的键值对(这里就是所有顶层用户表)“扁平化”到修饰的字段中。
  • HashMap<String, User>:用字符串作为键(对应TOML里的表名,如john),User结构体作为值,完美适配动态变化的用户表。

运行输出

Config {
    active_users: [
        "john",
        "new2rust",
    ],
    users: {
        "john": User {
            name: "John Doe"
        },
        "new2rust": User {
            name: "Jane Doe"
        },
        "randomguy": User {
            name: "Rust Guy"
        }
    }
}

这个方案完全适配配置的频繁更新,新增用户表后无需修改结构体代码,Serde会自动将其捕获到HashMap中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:20:28