使用None值解包HashMap时出现恐慌

fn pair_finder(pairs_length: u64) {
    let mut path: HashMap<u64, u64> = HashMap::new();

        for i in 0..pairs_length {
            if (metadata.token0 == pair_metadata.token0)
                || (metadata.token0 == pair_metadata.token1)
                || (i == *path.get(&current_depth).unwrap())
            {
                continue;
            }
    }
}

我有一个包含上述块的函数。Path 是HashMap其中第一个u64 是路径的 ID,第二个u64 是对 ID。current_depth used 是循环的一部分,在添加新的路径后它会增加。

然而它惊慌失措。这是因为我i == *path.get(&current_depth).unwrap()在 if 块中使用了。并且HashMap是空的current_depth并且它有一个None 值。有什么方法可以防止恐慌None并将 if 块视为false

thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src/main.rs:69:52

回答

Option<T> 执行EqT执行Eq。这意味着您可以直接比较该Option类型的变体,如下所示:

assert!(Some(1) == Some(1));
assert!(None::<i32> == None);
assert!(Some(1) != Some(2));
assert!(Some(1) != None);

所以不要写这个,如果maybe_vNone变体,它会恐慌:

maybe_v.unwrap() == a

你可以写这个,它只是评估falseifmaybe_vNone变体:

maybe_v == Some(a)

所以在你的情况下,你可以写:

fn pair_finder(pairs_length: u64) {
    let mut path: HashMap<u64, u64> = HashMap::new();

        for i in 0..pairs_length {
            if (metadata.token0 == pair_metadata.token0)
                || (metadata.token0 == pair_metadata.token1)
                || (Some(&i) == path.get(&current_depth))
            {
                continue;
            }
    }
}


以上是使用None值解包HashMap时出现恐慌的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>