Rust是否支持使用泛型返回类型的闭包?例如,我想写这样的东西:
let get<T: FromValue> = |s: &str| -> Option<T> { ... }
Run Code Online (Sandbox Code Playgroud)
但这种语法显然是错误的.
我想做什么
我正在使用rust-mysql-simple,我正在from_row
为我的User
struct 编写一个方法,从数据库行构建一个用户.
该库不提供(据我所知)一种按列名查找查询结果行值的方法.所以要解决这个问题,我的方法看起来像(这个编译并正常工作):
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() )
}
}
Run Code Online (Sandbox Code Playgroud)
这result
是一个对象,它包含有关查询列名的信息(用于查找列名的列索引),并row
包含查询结果行中的有序值.from_value_opt
是一个由库提供的方法,它接受Value
并返回一个Result<T, MyError>
.该值被强制转换为字段的类型.
我试图移动.and_then(|x| from_value_opt(x).ok() )
到get
关闭只是为了清理代码一些.但是,当我这样做时,闭包返回类型被解释为第一次出现get
调用的结果.
我将闭包重写为嵌套方法,如下所示: …
rust ×1