我正在深入研究Rust,特别是优雅地处理错误,但我对类型推断有点麻烦。
extern crate mysql;
use mysql as my;
fn main() {
my_test();
}
fn my_test() -> Result<(), my::Error> {
let pool = try!(my::Pool::new(""));
let res = try!(pool.prep_exec("select 1 as count", ()));
for rows in res {
let row: my::Row = try!(rows);
match row.take("count") {
None => (),
Some(i) => println!("{:?}", i),
};
}
Ok(())
}
导致
src / bin / main.rs:86:12:86:13错误:无法推断出有关
_
的足够类型信息;需要输入注释或通用参数绑定[E0282]
不幸的是,那箱子里的文件经常使用unwrap
,这对我没有帮助。在Haskell中,我会做类似println!("{:?}", i :: i32)
的事情,但我无法弄清楚如何在Rust中做到这一点。我尝试了各种方法来施放row.take
,但我没有运气。我很乐意看到我可以用各种方式构建这个代码,如果有一种更惯用的方式来实现它。
答案 0 :(得分:6)
查看Row::take
文档,我们可以看到两种类型参数T
和I
。类型I
是从"count"
参数推断的,类型T
用于返回类型。我们有两个选项来指定返回类型,方法调用中的explicit,或隐式的变量类型(就像你使用row
所做的那样):
fn my_test() -> Result<(), my::Error> {
let pool = try!(my::Pool::new(""));
let res = try!(pool.prep_exec("select 1 as count", ()));
for rows in res {
let mut row: my::Row = try!(rows);
// specify type T explicitly, let type I to be inferred
match row.take::<i32, _>("count") {
None => (),
Some(i) => println!("{:?}", i),
};
// or
let s: Option<i32> = row.take("count");
}
Ok(())
}
type ascription RFC提出了一种语法(类似于Haskell示例),用于注释带有类型的子表达式。