gpt4 book ai didi

rust - 遍历多维 BTreeMap

转载 作者:行者123 更新时间:2023-11-29 08:25:32 24 4
gpt4 key购买 nike

我正在使用 toml crate 来解析一个如下所示的 .toml 文件:

config = { option = "?" }


array = [
{ key1 = value1, key2 = value2, key3 = value3, key4 = value4 },
{ key1 = value1, key2 = value2, key3 = value3, key4 = value4 }
]

我有一个 parser.rs 文件,其中包含:

extern crate toml;

use std::collections::BTreeMap;
use std::fs::File;
use std::io::Read;

#[derive(Debug)]
pub struct ConfigParser<'a> {
pub file: &'a str
}

impl<'a> ConfigParser<'a> {
pub fn new(file: &'a str) -> ConfigParser {
ConfigParser { file: file }
}

pub fn parse(&self) -> Option<BTreeMap<String, toml::Value>> {
let mut config_string = String::new();
File::open(self.file).and_then(|mut f| {
f.read_to_string(&mut config_string)
}).unwrap();

return toml::Parser::new(&config_string).parse();
}
}

然后像这样在我的 main.rs 文件中使用它:

extern crate toml;
mod parser;

fn main() {
let config = parser::ConfigParser::new("config.toml").parse().unwrap();
println!("{:?}", config)
}

打印:

{"config": Table({"option": String("?")})

我尝试像这样遍历 config:

for (key, value) in config {
println!("{:?} {:?}", key, value)
}

这将产生:

"config" Table({"option": String("?")})

但是这个:

for (key, value) in config {
for v in value {
println!("{:?}", v)
}
}

抛出这个错误:

the trait `core::iter::Iterator` is not implemented for the type `toml::Value`

最佳答案

核心问题是toml::Value是一个单值。因此,迭代它没有意义。这类似于迭代 bool 值。

Value 是一个 enum ,这是一种数据类型,可以表示一组固定的选择之一。在这种情况下,它可能是类似 StringFloatTable 的东西。您的示例代码显示您有 Table 变体。 Value::Table 变体有一个 toml::Table结构作为唯一成员。这种类型只是另一种 BTreeMap

您已向编译器证明您能够处理您关心的特定变体。通常,这是通过 matchif let 语句完成的。一旦您验证变体是您关心的变体,您就可以继续深入了解嵌套值:

extern crate toml;

use toml::{Parser, Value};

fn main() {
let config_string = r#"config = { option = "?" }"#;
let parsed = Parser::new(config_string).parse().unwrap();

for (key, value) in parsed {
println!("{:?}, {:?}", key, value);

if let Value::Table(t) = value {
for (key, value) in t {
println!("{:?}, {:?}", key, value);
}
}
}
}

关于rust - 遍历多维 BTreeMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35518851/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com