安全地连续解包
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 let
的 matches!
宏。
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
}
你可以选择你最喜欢的那个。他们都编译成同样的东西(可能,我没有检查过)。
我有一个 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 let
的 matches!
宏。
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
}
你可以选择你最喜欢的那个。他们都编译成同样的东西(可能,我没有检查过)。