我有一組嵌套的結構,所有資料都是可選的。結構類似于以下內容(為簡單起見,我洗掉了一些 Optionals):
#[derive(Debug, Serialize, Deserialize)]
pub struct Device {
#[serde(rename = "_id")]
pub id: Option<bson::oid::ObjectId>,
pub system: Option<System>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct System {
pub id: Option<u32>,
pub mac: Option<String>,
}
當我查詢資料庫時,我得到了資料:
Ok(Some(Device { id: Some(ObjectId("...")), system: Some(System { id: Some(123), mac: Some("1234") })}))
我正在嘗試訪問 System 結構中的 id 值。我可以使用一些嵌套的 match 陳述句輕松訪問它,但我想知道是否有更簡單的解決方案。我一直在查看 unwrap_or、unwrap_or_else,但我一直無法獲得正確的語法。理想情況下,回傳 0 就足夠了,因為該值用于表示應用程式結構中的錯誤。嵌套的 match 陳述句作業正常 - 它只是有點冗長。
或者,我也可以只使用聚合管道來獲取值。我只是對替代品感到好奇。
謝謝。
uj5u.com熱心網友回復:
您可以使用and_then將函式應用于包含的Ok值,并None保持 s 不變。例如,想象以下結構:
struct Foo {
bar: Option<Bar>
}
struct Bar {
baz: Option<Baz>
}
struct Baz {
value: Option<i32>
}
然后,您可以查詢嵌套資料,例如:
fn read_value(foo: Foo) -> Option<i32> {
foo.bar
.and_then(|bar| bar.baz)
.and_then(|baz| baz.value)
}
如果有任何一個Option是None,則整個運算式將是None,否則它將是所包含的Some(value)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/357804.html
