连续安全地解开包装

Fru*_*ed -1 if-statement rust

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

if my_vec.get(0).is_some() && my_vec.get(0).unwrap().is_some() {      
    // My True Case
} else {
    // My Else Case
}
Run Code Online (Sandbox Code Playgroud)

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

Loc*_*cke 5

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

if my_vec.len() > x && my_vec[x].is_some() {
    // etc
}
Run Code Online (Sandbox Code Playgroud)

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

if let Some(Some(_)) = my_vec.get(x) {
    // etc
}
Run Code Online (Sandbox Code Playgroud)

matches!在这种情况下也可以使用该宏,就像if let您不需要引用数据时一样。

if matches!(my_vec.get(x), Some(Some(_))) {
    // etc
}
Run Code Online (Sandbox Code Playgroud)

或者and_then版本,但就我个人而言,它可能是我最不喜欢的,因为它更长并且掩盖了意图。

if my_vec.get(x).and_then(|y| y.as_ref()).is_some() {
    // etc
}
Run Code Online (Sandbox Code Playgroud)

您可以选择您最喜欢的一个。它们都编译成相同的东西(可能,我还没有检查)。

  • 我不同意第一点——`.get()`返回一个`Option`的全部原因正是这样你_不必_首先检查长度。模式匹配绝对是做到这一点的正确方法。 (2认同)