在Rust中的模式匹配中键入注释?

Dav*_*aly 2 rust

我正在深入研究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(())
}
Run Code Online (Sandbox Code Playgroud)

这导致

src/bin/main.rs:86:12:86:13错误:无法推断出足够的类型信息_; 需要输入注释或通用参数绑定[E0282]

不幸的是,那箱子里的文件使用unwrap了很多,这对我没有帮助.在Haskell中,我会做类似的事情println!("{:?}", i :: i32),但我无法弄清楚如何在Rust中做到这一点.我尝试了各种各样的方法row.take,但我没有运气.我希望看到我可以通过各种方式构建这个代码,如果有一种更惯用的方式来实现它.

mal*_*rbo 6

查看Row::take文档,我们可以看到两种类型的参数TI.该类型I是从"count"参数推断出来的,该类型T用于返回类型.我们有两个选项来指定返回类型,在方法调用中显式,或隐式在变量类型中(就像你使用的那样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(())
}
Run Code Online (Sandbox Code Playgroud)

类型归属RFC提出了用于注释的子表达与一种类型的语法(类似于Haskell的例子).