结构特征错误:类型参数数错误:预期为 1,找到 0



即使经过几个月的实验,我对 Rust 的工作原理还是有点陌生。我正在编写一个带有R2D2(0.8.0(和Rocket(0.4.4(+ Rocket_cors(0.5.2(的网络服务器

Rocket 允许您将其结构馈送到状态池中,因此我不必在每次有人发送请求时初始化我的 Postgres 服务器。代码如下:

struct ConnectionPool<M: r2d2::ManageConnection> {
val: r2d2::Pool<M>
}
#[post("/upload", format = "application/json", data = "<data>")]
fn upload(data: Data, state: rocket::State<ConnectionPool>) {
if data.peek_complete() {
println!("All of the data: {:?}", str::from_utf8(data.peek()).unwrap());
}
//data.stream_to_file(env::temp_dir().join("upload.txt"))
//    .map(|n| n.to_string())
//    .map_err(Debug)
}

显然,这只是代码的一个片段,但是r2d2::ConnectionPool需要一个类型标识符:如果我忽略要求(在上面代码片段的第4行(,就会给我这个错误:

wrong number of type arguments: expected 1, found 0
expected 1 type argumentrustc(E0107)
main.rs(45, 44): expected 1 type argument

但是当我尽力通过更新代码来解决问题时:

fn upload(data: Data, state: rocket::State<ConnectionPool>) {
|
v
fn upload(data: Data, state: rocket::State<ConnectionPool<r2d2::ManageConnection>>) {

我收到此错误:

the size for values of type `(dyn r2d2::ManageConnection + 'static)` cannot be known at compilation time
doesn't have a size known at compile-time
help: the trait `std::marker::Sized` is not implemented for `(dyn r2d2::ManageConnection + 'static)`

r2d2::ManageConnection是一种特质。与其重复特征名称,不如向它传递实现特征的具体类型。由于您使用的是 Postgres,因此您可能希望:

fn upload(data: Data, state: rocket::State<ConnectionPool<PostgresConnectionManager>>)

或者,如果要使代码数据库保持不可知性,则可以使该方法在连接类型上泛型,并让调用方决定:

fn upload<M: r2d2::ManageConnection>(data: Data, state: rocket::State<ConnectionPool<M>>)

相关内容