Rustは一般的な戻り値の型でクロージャをサポートしますか?たとえば、次のような記述をしたいとします。ジェネリッククロージャを定義することはできますか?
let get<T: FromValue> = |s: &str| -> Option<T> { ... }
しかし、この構文は明らかに間違っています。私はrust-mysql-simpleで働いている
やろうとしている、と私はデータベース行からユーザーを構築するために、私のUser
構造体のためfrom_row
方法を書いて何
。
ライブラリは、(私が知る限り)クエリ結果の行の値を列名で検索する方法を提供していません。だから、この問題を回避するために、私の方法は、(これはコンパイルし、正常に動作する)ようになっています
ここ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())
}
}
、result
が(列名の列インデックスを見つけるために使用されるクエリの列名についての情報を含むオブジェクトであります)、row
には、クエリ結果の行から順序付けられた値が含まれています。 from_value_opt
は、ライブラリによって提供されるメソッドで、Value
を返し、Result<T, MyError>
を返します。値はフィールドの型に変換されます。
私は.and_then(|x| from_value_opt(x).ok())
をget
クロージャに移動しようとしていましたが、コードの一部をクリーンアップしました。しかし、私がそうすると、クロージャの戻り値の型はget
呼び出しの最初の発生の結果であると解釈されます。
私は次のようになり、ネストされた方法として閉鎖を書き直し:
もうまくいきましたが、はるかに冗長性をカットする助けにはならなかったfn get<T: FromValue>(r: &QueryResult, m: &mut HashMap<usize, Value>, s: &str)
-> Option<T> { ... }
。
おかげで、私は私がやろうとしていますかについていくつかの情報を追加しました。 –