我有一个TOML文档,其中有些键可能存在,也可能不存在。本文件是一份有效的文件:
foo = "bar"但这也是有效的:
foo = "bar"
something = "else"我现在试图用库古墓在Rust中解析这个文档。但是,我无法在文档中找到任何指南,说明如何确定TOML文档中是否确实存在密钥。每当我试图访问这个键时,程序就会因错误index not found而恐慌。
我想出了以下极简的示例,说明当我试图访问不存在的密钥时,锈蚀代码立即失败:
use toml::Value;
fn main() {
let value = "foo = 'bar'".parse::<Value>().unwrap();
println!("{:?}", value["foo"]);
println!("{}", "before");
println!("{:?}", value["foo2"]);
println!("{}", "after");
}这将导致输出:
String("bar")
before
thread 'main' panicked at 'index not found', src/libcore/option.rs:1034:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.在库的实际代码中,我找到了get,它声明:
如果给定的键不存在于映射中,或者给定的索引不在数组的范围内,则返回
None。
但是,我不确定这是否也适用于我的密钥访问。至少在我的测试中没有。我也无法在代码中找到一个函数来检查键是否存在。
我想一定有什么方法可以找出TOML文档中是否存在密钥?
发布于 2019-09-15 19:01:28
get()和您正在做的是进入库的两条完全不同的路径。这种按键访问是Index<_>,如果密钥不存在,会惊慌.
这就是您在代码中看到的内容。
要完成您想要做的事情,真正的方法实际上是使用get(),它将返回一个Option,但是首先,我们将整理出您所提供的toml不是一个表的情况,如下所示:
use toml::{Value};
use toml::map::Map;
fn main() {
let value = "foo = 'bar'".parse::<Value>().ok().and_then(|r| match r {
Value::Table(table) => Some(table),
_ => None
}).unwrap_or(Map::new()); // This now contains a HashMap<String, Value>
println!("{:?}", value.get("foo"));
println!("{}", "before");
println!("{:?}", value.get("foo2"));
println!("{}", "after");
}https://stackoverflow.com/questions/57946845
复制相似问题