如何从字符串创建响应?(Rust-Rocket)

时间:2019-08-23 03:13:43

标签: rust rust-rocket

我尝试为“ MyConfig”结构实现Responder特性。 但是我不知道如何创建可以从函数返回的Response(包括类型为String的主体)。

我尝试了这段代码。

#[derive(Debug)]
struct MyConfig {
    body: String,
}

impl<'r> Responder<'r> for MyConfig {
    fn respond_to(self, _req: &Request) -> response::Result<'r> {
        let body: String = self.body.clone();
        Response::build()
            .status(Status::Ok)
            // .raw_header("Access-Control-Allow-Origin", "*")
            .sized_body(Cursor::new(body.as_str()))
            .ok()
    }
}

无法编译,并显示此错误。

error[E0515]: cannot return value referencing local variable `body`
  --> src/main.rs:53:9
   |
53 | /         Response::build()
54 | |             .status(Status::Ok)
55 | |             // .raw_header("Access-Control-Allow-Origin", "*")
56 | |             .sized_body(Cursor::new(body.as_str()))
   | |                                     ---- `body` is borrowed here
57 | |             .ok()
   | |_________________^ returns a value referencing data owned by the current function

1 个答案:

答案 0 :(得分:0)

body是局部变量,body.as_str()是对该局部变量的引用。该引用的寿命不足,无法包含在该函数返回的Result中。

由于在body中使用后不需要Cursor::new(),因此可以直接传递而不是作为参考传递吗?

.sized_body(Cursor::new(body))

ETA:我找到了这个例子:

Response::build()
    .sized_body(Cursor::new(format!("{}:{}", self.name, self.age)))

(来自https://api.rocket.rs/v0.4/rocket/response/trait.Responder.html

他们正在使用字符串而不是引用来调用Cursor::new(),所以Cursor::new(body)应该可以工作。

但是,请考虑一下它,因为您将self直接传递到函数中而不是作为参考,也许您可​​以完全跳过创建body并说:

.sized_body(Cursor::new(self.body))