无法推断出"U"的类型

Bal*_*laB 2 rust rust-diesel

我正在使用Rust和Diesel:

fn create_asset_from_object(assets: &HashMap<String, Assets_Json>) {
    let connection: PgConnection  = establish_connection();
    println!("==========================================================");
    insert_Asset(&connection, &assets);
}

pub fn insert_Asset(conn: &PgConnection, assests: &HashMap<String, Assets_Json>){
    use self::schema::assets;

    for (currency, assetInfo) in assests {

        let new_asset = self::models::NewAssets {
            asset_name: &currency,
            aclass:  &assetInfo.aclass,
            altname: &assetInfo.altname,
            decimals:  assetInfo.decimals,
            display_decimals: assetInfo.display_decimals,
        };

       //let result = diesel::insert(&new_asset).into(assets::table).get_result(conn).expect("Error saving new post");
       println!("result, {:#?}", diesel::insert(&new_asset).into(assets::table).get_result(conn).expect("Error saving new post"));

    }
}
Run Code Online (Sandbox Code Playgroud)

编译错误:

error[E0282]: type annotations needed
   --> src/persistence_service.rs:107:81
    |
107 |        println!("result, {:#?}", diesel::insert(&new_asset).into(assets::table).get_result(conn).expect("Error saving new post"));
    |                                                                                 ^^^^^^^^^^ cannot infer type for `U`
Run Code Online (Sandbox Code Playgroud)

She*_*ter 8

我强烈建议您返回并重新阅读The Rust Programming Language,第二版,特别是关于泛型章节.


LoadDsl::get_result 定义为:

fn get_result<U>(self, conn: &Conn) -> QueryResult<U> 
where
    Self: LoadQuery<Conn, U>, 
Run Code Online (Sandbox Code Playgroud)

换句话说,这意味着调用的结果get_result将由调用者选择QueryResult的类型参数化; 通用参数.U

你的电话get_result决不会指明具体的类型U.在许多情况下,类型推断用于了解类型应该是什么,但您只是打印该值.这意味着它可以是任何实现特征的类型并且是可打印的,这还不足以最终决定.

您可以使用turbofish运算符:

foo.get_result::<SomeType>(conn)
//            ^^^^^^^^^^^^ 
Run Code Online (Sandbox Code Playgroud)

或者,您可以将结果保存到具有指定类型的变量:

let bar: QueryResult<SomeType> = foo.get_result(conn);
Run Code Online (Sandbox Code Playgroud)

如果您查看Diesel教程,您将看到这样的函数(我已编辑它以删除不相关的细节):

pub fn create_post() -> Post {
    diesel::insert(&new_post).into(posts::table)
        .get_result(conn)
        .expect("Error saving new post")
}
Run Code Online (Sandbox Code Playgroud)

这里,类型推断启动因为expect删除QueryResult包装器并且函数的返回值必须是a Post.向后工作,编译器知道U必须相等Post.

如果您查看了文档,insert可以看到execute如果您不关心插入的值,则可以调用:

diesel::insert(&new_user)
    .into(users)
    .execute(&connection)
    .unwrap();
Run Code Online (Sandbox Code Playgroud)