我尝试为“ 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
答案 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))