Rust 结构特征错误:类型参数数目错误:应为1,找到0

Rust 结构特征错误:类型参数数目错误:应为1,找到0,rust,Rust,我对锈菌是如何工作的这个概念有点陌生,即使在用它做了几个月的实验之后。我正在用R2D2(0.8.0)和Rocket(0.4.4)+Rocket_cors(0.5.2)编写一个Web服务器 Rocket允许您将它的结构输入状态池,这样我就不必每次有人发送请求时都初始化我的Postgres服务器。代码如下: struct ConnectionPool<M: r2d2::ManageConnection> { val: r2d2::Pool<M> } #[post("

我对锈菌是如何工作的这个概念有点陌生,即使在用它做了几个月的实验之后。我正在用R2D2(0.8.0)和Rocket(0.4.4)+Rocket_cors(0.5.2)编写一个Web服务器

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)
}
fn upload(data: Data, state: rocket::State<ConnectionPool>) {

    |
    v

fn upload(data: Data, state: rocket::State<ConnectionPool<r2d2::ManageConnection>>) {
但当我尽力通过更新代码来解决问题时:

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)
}
fn upload(data: Data, state: rocket::State<ConnectionPool>) {

    |
    v

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

r2d2::ManageConnection
是一种特性。您需要传递一个实现该特性的具体类型,而不是重复该特性名称。由于您正在使用Postgres,您可能需要:

fn upload(data: Data, state: rocket::State<ConnectionPool<PostgresConnectionManager>>)
fn上传(数据:数据,状态:火箭::状态)
或者,如果希望保持代码数据库不可知,可以使该方法在连接类型上通用,并让调用方决定:

fn upload<M: r2d2::ManageConnection>(data: Data, state: rocket::State<ConnectionPool<M>>)
fn上传(数据:数据,状态:火箭::状态)

r2d2::ManageConnection
是一种特性。您需要指定实际使用的具体连接类型。您没有共享创建连接池的代码,因此我们无法告诉您该类型。