如何创建不同类型的 HashMap 并测试它们是否相等?

bla*_*eep 5 rust

我有一个包含多个键和值的源 JSON,我想获取多个目标 JSON 并检查它们是否是该 JSON 的子集:目标 JSON 中的所有字段都存在于源 JSON 中并保持相同的值。

为了实现这一点,我想在 a 的值部分放置几个不同类型的值HashMap并调用equals这些值。

地图中有几种类型的值,我想接受一些键值对并检查是否

  1. 钥匙在地图上
  2. 该值与地图中的值相同。

这是我想在 Java 中做的一个例子:

boolean isInMap(Map<String, Object> map, String key, Object value) {
    return map.containsKey(key) && map.get(key).equals(value);
}
Run Code Online (Sandbox Code Playgroud)

这可能是一个XY 问题,但我如何在 Rust 中做到这一点?

bla*_*eep 0

这几乎就是@mcarton 在 Serde JSON 库中提到的内容,只是我使用了枚举匹配,我不确定这更好。

enum Value {
    Str(String),
    Int(i32),
    // other value types
}

impl PartialEq for Value {
    fn eq(&self, other: &Value) -> bool {
        match *self {
            Value::Str(ref s1) => match *other {
                Value::Str(ref s2) => s1 == s2,
                _ => false
            },
            Value::Int(i1) => match *other {
                Value::Int(i2) => i1 == i2,
                _ => false
            },
            // other implementations
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

由于我需要支持的类型少于 Serde 中提供的类型,并且我正在尝试 Rust,所以我创建了自己的枚举而不是使用serde_json::Value

  • 通常,这样的匹配将[写在值的元组上](https://play.rust-lang.org/?gist=5c2ee66415b0409a2fe19a0c6d887f8c&amp;version=stable)。在这种特定情况下,您可以[仅针对您的类型使用`#[derive(PartialEq)]`](https://play.rust-lang.org/?gist=e0fdfd70a0e1add5d55d984e55f5ebad&amp;version=stable)。 (2认同)
  • 在一般情况下,它“必须”是运行时检查。毕竟,该变量可能来自源代码外部。我确信优化器会消除某些常量情况。有一些[工具可以让您准确地看到它将扩展为什么](/sf/answers/2634730871/)。 (2认同)