【发布时间】:2016-01-15 15:27:01
【问题描述】:
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> { ... }
这也很好,但没有帮助减少冗长。
【问题讨论】:
-
谢谢,我添加了一些关于我想要做什么的信息。
标签: rust