- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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 ,这是一种数据类型,可以表示一组固定的选择之一。在这种情况下,它可能是类似 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);
}
}
}
}
关于rust - 遍历多维 BTreeMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35518851/
我试图理解两者之间的区别 let rows = Vec::new(); for (k, v) in my_btree { // BTreeMap rows.push((&k, &v)) //
此示例代码: use std::collections::BTreeMap; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, S
我可以将枚举转换为 TreeMap 吗? enum En1 { val1, val2, val3 } fn fn1() -> BTreeMap { let mut map = BTre
我正在使用 toml crate 来解析一个如下所示的 .toml 文件: config = { option = "?" } array = [ { key1 = value1, key2
刚开始(尝试)学习 Rust。如何使用“bytestrings”作为 std::collections::BTreeMap 中的键? 似乎我不能使用 [u8],因为该类型需要固定大小。 使用向量,例如
下面的两个代码块是等效的,但由于某种原因,我在第二个代码块上遇到了编译器错误。 我很难理解为什么 names在一个版本中借用,而不是在另一个版本中。 我试图弄清楚如何从不可变的 BTreeMap 中读
我正在使用霍夫曼编码在 Rust 中创建压缩/解压缩库。第一步是创建一个包含所有唯一字符和出现次数的数据结构。我从一个简单的文本文件开始,遇到与换行符“字符”相关的问题。 我第一次尝试解决这个问题是构
代码: #[derive(Debug)] struct Haha { data: i32, } use std::collections::BTreeMap; fn main() {
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我想从有序 集合中找到第一个大于限制的元素。虽然对其进行迭代始终是一种选择,但我需要一个更快的方法。目前,我想出了一个像this这样的解决方案。但感觉有点老套: use std::cmp::Order
我正在做一个锻炼练习,其中我需要反转拼字游戏分数的 map ;分数图 => 字母变成字母图 => 分数。我想出了以下 Rust 代码: use std::collections::BTreeMap;
如果您有键/值对(或键)的排序映射,一个明显的操作是获取第一对或最后一对(或键)。 C++ 的 std::vector有 front() 和 back() 用于此目的。 std::map不会,但是 *
我不确定这是否是一个新手问题。 rust 标准库 std::collections提供 map 和 set 的 B-tree 实现。 我查看了文档 here ,但我找不到用于实现的分支因子 m。 最佳
这个问题在这里已经有了答案: How to make a compiled Regexp a global variable? (1 个回答) Why can't const functions i
我想调用range在 BTreeMap 上,键是像 (a,b) 这样的元组.假设我们有: (1, 2) => "a" (1, 3) => "b" (1, 4) => "c" (2, 1) => "d"
我正在尝试从 BTreeMap 构建一个 RangeSet(其中键是下限,值是上限)。只要我只是在查找东西,这就很好用。然而,第一个变异方法让我难住了: 如果我想插入一个范围到我的集合,我需要检查我的
如果我对 B 树的理解正确,那么在对数时间内搜索 key 应该是容易且可能的。如果key不存在,返回下一个更小更大的key;给定键的邻居,如果它会被插入。 这个功能是否已经存在? 使用当前 API 的
此处来自 Python。 我想知道为什么 BTreeMap 是可散列的。我并不惊讶 Hashmap 不是,但我不明白为什么 BTreeMap 是。 例如,我可以这样做: let mut seen_co
此处来自 Python。 我想知道为什么 BTreeMap 是可散列的。我并不惊讶 Hashmap 不是,但我不明白为什么 BTreeMap 是。 例如,我可以这样做: let mut seen_co
use std::collections::btree_map::BTreeMap; fn main() { let mut map: BTreeMap; map.insert("na
我是一名优秀的程序员,十分优秀!