首页 文章

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

提问于
浏览
2

我正在深入研究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) 的事情,但是我可以尝试各种方式来投射 row.take ,但是我有幸运气 . 我喜欢看到我可以通过各种方式构建这个代码,如果有一种更惯用的方式来实现它 .

1 回答

  • 4

    查看Row::take文档,我们可以看到两个类型参数 TI . 类型 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示例),用于使用类型注释子表达式 .

相关问题