Unterstützt Rust Verschlüsse mit generischen Rückgabetypen? Zum Beispiel möchte ich etwas in der Art schreiben:Mögliche generische Schließung definieren?
let get<T: FromValue> = |s: &str| -> Option<T> { ... }
Aber diese Syntax ist eindeutig falsch.
Was ich versuche zu tun
ich mit rust-mysql-simple arbeiten bin, und ich bin eine from_row
Methode für meine User
struct schreiben, einen Benutzer aus einer Datenbankzeile zu bauen.
Die Bibliothek bietet (so weit ich das beurteilen kann) keine Möglichkeit, Abfrageergebniszeilen nach Spaltennamen zu suchen. Also, dies zu umgehen, meine Methode sieht so aus (das kompiliert und funktioniert einwandfrei):
fn from_row(result: &QueryResult, row: Vec<Value>) -> User {
let mut map: HashMap<_, _> = row.into_iter().enumerate().collect();
let mut get = |s: &str| {
result.column_index(s)
.and_then(|i| map.remove(&i))
};
User {
id: get("id").and_then(|x| from_value_opt(x).ok())
}
}
Hier result
ist ein Objekt, die Informationen über die Anfrage des Spaltennamen enthält (verwendet, um den Spaltenindex für einen Spaltennamen zu finden) und die row
enthält die geordneten Werte aus einer Abfrageergebniszeile. from_value_opt
ist eine von der Bibliothek bereitgestellte Methode, die eine Value
übernimmt und eine Result<T, MyError>
zurückgibt. Der Wert wird auf den Feldtyp angewendet.
Ich habe versucht, die .and_then(|x| from_value_opt(x).ok())
in die get
Schließung zu verschieben, nur um den Code etwas aufzuräumen. In diesem Fall wird der Rückgabetyp der Schließung als Ergebnis des ersten Auftretens des Aufrufs get
interpretiert.
ich die Schließung als verschachtelte Verfahren neu geschrieben, die wie folgt aussieht: viel
fn get<T: FromValue>(r: &QueryResult, m: &mut HashMap<usize, Value>, s: &str)
-> Option<T> { ... }
das auch gut funktioniert, aber nicht helfen, die Ausführlichkeit zu schneiden.
Dank, habe ich einige Informationen über das, was ich zu tun versuchen. –