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

g14*_*14u 1 rust

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;
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个包含上述块的函数。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
Run Code Online (Sandbox Code Playgroud)

Leo*_*Leo 6

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

assert!(Some(1) == Some(1));
assert!(None::<i32> == None);
assert!(Some(1) != Some(2));
assert!(Some(1) != None);
Run Code Online (Sandbox Code Playgroud)

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

maybe_v.unwrap() == a
Run Code Online (Sandbox Code Playgroud)

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

maybe_v == Some(a)
Run Code Online (Sandbox Code Playgroud)

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

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;
            }
    }
}
Run Code Online (Sandbox Code Playgroud)