Mam ten kod.Czy istnieje sposób na powiązanie mapowania wyników i rozpakowywania?
if let Ok(file) = env::var("CONF") {
if let Ok(mut reader) = fs::File::open(&file) {
if let Ok(conf) = Json::from_reader(&mut reader) {
// do something with conf
}
}
}
Staram się, aby było mniej jak świąteczne drzewo świąteczne i myślałem o łańcuchowaniu. Zauważ, że każdy krok w tym łańcuchu daje kolejny Result
, więc wyraźnie to nie zadziała (otrzymamy Result
w Result
).
let conf = env::var("CONF")
.map(fs::File::open)
.map(Json::from_reader);
// do something with conf
także moje typy błędów różnią się dla każdego kroku, co oznacza, że nie można po prostu zastąpić .map
z .and_then
.
Myślę, że szukam czegoś podobnego do obietnic JavaScriptu. Oznacza to, że obietnica zwrócona z wewnątrz obietnicy odwija wewnętrzną obietnicę. Podpis powinien prawdopodobnie wyglądać następująco:
impl<T, E> Result<T, E> {
fn map_unwrap<F, U, D>(&self, op: F) -> Result<U, D>
where F: FnOnce(T) -> Result<U, D>
}
Czy istnieje taki mechanizm w Rust? Czy istnieje inny sposób na pozbycie się mojego świątecznego drzewa na wakacje?
W tym momencie powstał świetny artykuł: https://mgattozzi.com/posts/russian-dolls.html – squiguy
Dzięki! Sprawdzam to! –
Używam 'try!()' Makro – Stargateur