0

我试图为“MyConfig”结构实现响应者特征。但我不知道如何创建可以从函数返回的响应(包括类型为字符串的主体)。

我试过这段代码。

#[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
4

1 回答 1

0

body是一个局部变量,并且body.as_str()是对该局部变量的引用。引用的寿命不够长,无法作为函数返回的 Result 的一部分包含在内。

既然在 in 中使用后不需要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))
于 2019-08-23T03:31:39.607 回答