首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查TOML中是否存在带有toml的密钥?

如何检查TOML中是否存在带有toml的密钥?
EN

Stack Overflow用户
提问于 2019-09-15 18:05:44
回答 1查看 776关注 0票数 1

我有一个TOML文档,其中有些键可能存在,也可能不存在。本文件是一份有效的文件:

代码语言:javascript
复制
foo = "bar"

但这也是有效的:

代码语言:javascript
复制
foo = "bar"
something = "else"

我现在试图用库古墓在Rust中解析这个文档。但是,我无法在文档中找到任何指南,说明如何确定TOML文档中是否确实存在密钥。每当我试图访问这个键时,程序就会因错误index not found而恐慌。

我想出了以下极简的示例,说明当我试图访问不存在的密钥时,锈蚀代码立即失败:

代码语言:javascript
复制
use toml::Value;

fn main() {
    let value = "foo = 'bar'".parse::<Value>().unwrap();

    println!("{:?}", value["foo"]);
    println!("{}", "before");
    println!("{:?}", value["foo2"]);
    println!("{}", "after");
}

这将导致输出:

代码语言:javascript
复制
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文档中是否存在密钥?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-15 19:01:28

get()和您正在做的是进入库的两条完全不同的路径。这种按键访问是Index<_>,如果密钥不存在,会惊慌.

这就是您在代码中看到的内容。

要完成您想要做的事情,真正的方法实际上是使用get(),它将返回一个Option,但是首先,我们将整理出您所提供的toml不是一个表的情况,如下所示:

代码语言:javascript
复制
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");
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57946845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档