我使用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`
答案 0 :(得分:3)
核心问题是toml::Value
是单一值。因此,迭代它是没有意义的。这类似于迭代布尔值。
Value
是enum,这是一种数据类型,可以代表一组固定的选择。在这种情况下,它可能类似于String
或Float
或Table
。您的示例代码显示您拥有Table
变体。 Value::Table
变体有toml::Table
结构作为唯一成员。这种类型只是另一种BTreeMap
。
您已向编译器证明您能够处理您关心的特定变体。通常,这是通过match
或if 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);
}
}
}
}