我有一个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
类似的运算符,但没有任何运气。
我会首先检查长度并像常规数组一样访问它,而不是使用它,.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)
您可以选择您最喜欢的一个。它们都编译成相同的东西(可能,我还没有检查)。
归档时间: |
|
查看次数: |
271 次 |
最近记录: |