2017-02-27 2 views
4

Ich benutze die future Bibliothek und ich habe eine Zukunft, die Future<T, E> implementiert. Ich möchte diese Zukunft mit einer Funktion FnOnce(T) -> D wo D: From<E> zuordnen. Jetzt, wenn ich wait() für diese Zukunft zu Finih will, werde ich eine Result<Result<T, E>, D> bekommen, aber ich möchte eine Result<T, D>.Warten auf ein Ergebnis abgebildet Zukunft

Hier einige Beispiel-Code für ein besseres Verständnis:

struct ReadError; 

enum DownloadError { 
    Read(ReadError), 
    Parse(ParseError), 
} 

impl From<ReadError> for DownloadError { ... } 

fn parse(bytes: [u8; 4]) -> Result<i32, DownloadError> { ... } 

fn map_and_wait<F: Future<Item = [u8; 4]; Error = ReadError>>(f: F) -> Result<i32, DownloadError> { 
    match f.map(|x| parse(x)).wait() { 
     Ok(Ok(x)) => Ok(x), 
     Ok(Err(x)) => Err(x.into()), 
     Err(x) => Err(x), 
    } 
} 

Was ist die einfachste und verständliche Art und Weise, dies zu tun (ohne match ing)?

+0

Es könnte einfacher sein, zu antworten, wenn Sie ein vollständiges Codebeispiel zur Verfügung stellen, mit dem 'match'ing, die Sie vermeiden mögen. –

+0

@PeterHall OK, ich habe meine Frage bearbeitet. – torkleyy

Antwort

2

fand ich eine Antwort auf die Frage:

Sie können direkt mit dem ersten wait über die Zukunft bis zum Ende ? verwenden, um einen möglichen Fehler zurück und wende parse auf dann:

parse(f.wait()?) 

Dies sollte gleiche Semantik haben, weil die Future, die von map zurückgegeben wird, ihre Abfrage beendet. Ein andere Lösung war ein möglichen Fehler zu erfassen und and_then zu verwenden:

f.map_error(|x| x.into()).and_then(|x| parse(x)).wait() 
+0

Froh, dass Sie es herausgefunden haben. '' 'räumt wirklich auf! –

+0

Beachten Sie, dass für den Zweck der 'futures' soll Zusammensetzung in der Regel über einen expliziten Aufruf bevorzugt werden, zu warten, sice es erweiterbar ist und Asynchronität bewahren. Wie auch immer diese Zeile Code kann als 'f.from_err() geschrieben prägnanter werden. UND_DANN (Parsing) .wait()'. – dippi

Verwandte Themen