迭代多维BTreeMap

时间:2016-02-20 03:42:25

标签: rust

我使用toml包来解析.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`

1 个答案:

答案 0 :(得分:3)

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

Valueenum,这是一种数据类型,可以代表一组固定的选择。在这种情况下,它可能类似于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);
            }
        }
    }
}