我正在深入研究 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
很多,这对我没有帮助。在哈斯克尔,我会做类似的事情println!("{:?}", i :: i32)
,但我不知道如何在 Rust 中做到这一点。我尝试过各种方法来投射row.take
,但我没有任何运气。如果有更惯用的方法的话,我很乐意看到可以用多种方式来构造此代码。
看着Row::take http://blackbeam.org/doc/mysql/struct.Row.html#method.take文档中我们可以看到两种类型的参数T
and I
。方式I
推断自"count"
参数,类型T
用于返回类型。我们有两个选项来指定返回类型,explicit https://doc.rust-lang.org/reference.html#generic-functions在方法调用中,或隐含在变量类型中(就像您所做的那样)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(())
}
The 类型归属 RFC https://github.com/rust-lang/rfcs/blob/master/text/0803-type-ascription.md提出了一种用类型注释子表达式的语法(类似于 Haskell 示例)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)