我正在使用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: ¤cy,
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"));
}
}
编译错误:
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`
答案 0 :(得分:7)
我强烈建议您返回并重新阅读The Rust Programming Language, second edition,特别是chapter on generics。
fn get_result<U>(self, conn: &Conn) -> QueryResult<U>
where
Self: LoadQuery<Conn, U>,
简而言之,这意味着调用get_result
的结果将是QueryResult
由调用者选项的类型参数化;通用参数U
。
您对get_result
的调用绝不会指定U
的具体类型。在许多情况下,类型推断用于了解类型应该是什么,但您只是打印该值。这意味着它可能是任何类型,它实现了特征并且是可打印的,这还不足以最终决定。
您可以使用 turbofish 运算符:
foo.get_result::<SomeType>(conn)
// ^^^^^^^^^^^^
或者您可以将结果保存到具有指定类型的变量:
let bar: QueryResult<SomeType> = foo.get_result(conn);
如果您查看Diesel tutorial,您会看到这样的功能(我已编辑其中删除了不相关的详细信息):
pub fn create_post() -> Post {
diesel::insert(&new_post).into(posts::table)
.get_result(conn)
.expect("Error saving new post")
}
此处,类型推断会启动,因为expect
会删除QueryResult
包装器,并且函数的返回值必须为Post
。向后工作,编译器知道U
必须等于Post
。
如果您查看了documentation for insert
,可以看到如果您不想回复插入值,可以致电execute
:
diesel::insert(&new_user)
.into(users)
.execute(&connection)
.unwrap();