我有一個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和類似的運算子,但沒有任何運氣。
uj5u.com熱心網友回復:
我會首先檢查長度并像常規陣列一樣訪問它,而不是使用它,.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
}
在這種matches!情況下也可以使用宏,類似于if let不需要參考資料的情況。
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
}
你可以選擇你最喜歡的那個。它們都編譯成相同的東西(可能,我沒有檢查過)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/460683.html
