具有生存期值的Rust函数返回类型

时间:2019-08-22 00:03:45

标签: rust traits lifetime rust-rocket

我想为我的Responder结构实现Hero特性,但是要使用以下方法签名(respond_to):

use rocket::{http::Status, response::Responder, Request, Response};
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize)]
pub struct Hero {
    pub id: Option<i32>,
    pub name: String,
    pub identity: String,
    pub hometown: String,
    pub age: i32,
}

impl Hero {
    pub fn new(
        num: Option<i32>,
        name: String,
        identity: String,
        hometown: String,
        age: i32,
    ) -> Hero {
        Hero {
            id: num,
            name,
            identity,
            hometown,
            age,
        }
    }
}

impl<'r> Responder<'r> for Hero {
    fn respond_to(self, _request: &Request) -> Result<Response, Status> {
        unimplemented!()
    }
}

引发编译错误:

error[E0106]: missing lifetime specifier
  --> src/main.rs:32:55
   |
32 |     fn respond_to(self, _request: &Request) -> Result<Response, Status> {
   |                                                       ^^^^^^^^ expected lifetime parameter
   |
   = help: this function's return type contains a borrowed value, but the signature does not say which one of `_request`'s 2 lifetimes it is borrowed from

依赖项:

[dependencies]
rocket = "0.4.2"
serde = {version = "1.0.99", features=["derive"]}

文档没有提供如何在返回类型时提供生存期的示例。返回类型时如何指定生存期?

1 个答案:

答案 0 :(得分:2)

Responder特征定义为:

pub trait Responder<'r> {
    fn respond_to(self, request: &Request) -> response::Result<'r>;
}

response::Result<'r>定义为:

pub type Result<'r> = ::std::result::Result<self::Response<'r>, ::http::Status>;

您的方法签名是:

fn respond_to(self, request: &Request) -> Result<Response, Status>;

如您所见,您只是忘记为Response指定生存期。正确的方法签名是:

impl<'r> Responder<'r> for Hero {
    fn respond_to(self, request: &Request) -> Result<Response<'r>, Status> {
        unimplemented!()
    }
}