Próbuję obsługiwać błędy otrzymane z połączenia asynchronicznego:

let res: Result<TcpStream, Box<dyn std::error::Error>> = session.runtime().borrow_mut().block_on(async {
    let fut = TcpStream::connect(session.configuration().socket()).await?;
    Ok(fut)
});

Próbowałem zrobić to starej szkoły sposób, jeśli kompilator nie podobał się:

if res.is_err() {
    return Err(res);
}

Po kilku Googling natknąłem się na to:

let mut stream = match res {
    Ok(res) => res,
    Err(res) => return Err(res),
};

Który czuje się bardzo taki sam, ale z równoważnikiem oświadczenia przełącznika. Dlaczego nie mogę użyć if?

0
ruipacheco 12 październik 2020, 22:00

1 odpowiedź

Najlepsza odpowiedź

if res.is_err() { return res } powinien działać. Result jest łącznikiem z dwoma wariantami: Ok, który przez konwencję posiada "udany wynik" i Err, który posiada informacje o błędzie. Jak John {x2}} Operator, który skompresowałby deklarację po prostu:

let mut stream = res?;
1
user4815162342 12 październik 2020, 19:31