2016-02-20 79 views
0

我使用toml箱子来解析.toml文件,该文件是这样的:迭代多维BTreeMap

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) 
} 

其中pr整型:

{"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` 

回答

3

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

A 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); 
      } 
     } 
    } 
}