安全地连续解包

Safely unwrap consecutively

我有一个 if 语句需要检查嵌套 Option 中是否存在值。该语句目前看起来像

if my_vec.get(0).is_some() && my_vec.get(0).unwrap().is_some() {      
    // My True Case
} else {
    // My Else Case
}

我觉得这是检查这个潜在嵌套值是否存在的业余方法。我想在从数组中获取 Option 时保持安全,因为它可能存在也可能不存在,并且在展开 Option 本身时也是如此。我尝试使用 and_then 和类似的运算符,但没有成功。

我会先检查长度并像访问常规数组一样访问它而不是使用 .get(x) 除非这样做有一些好处(比如将它传递给需要选项的东西)。

if my_vec.len() > x && my_vec[x].is_some() {
    // etc
}

另一种选择是仅将值与 if let x = y 或完整的 match 语句匹配。

if let Some(Some(_)) = my_vec.get(x) {
    // etc
}

当您不需要引用数据时,也可以在这种情况下使用类似于 if letmatches! 宏。

if matches!(my_vec.get(x), Some(Some(_))) {
    // etc
}

and_then 版本,但就我个人而言,它可能是我最不喜欢的,因为它更长并且含糊其辞。

if my_vec.get(x).and_then(|y| y.as_ref()).is_some() {
    // etc
}

你可以选择你最喜欢的那个。他们都编译成同样的东西(可能,我没有检查过)。