【发布时间】:2023-02-20 21:44:11
【问题描述】:
我是 Rust 的新手,正在努力学习。我正在使用 Rocket 创建一个传递一些键/值对的 API 端点。我已经这样定义了我的结构:
#[derive(Deserialize)]
#[serde(crate = "rocket::serde")]
#[derive(Debug)]
struct PostDocument<'r> {
fields: Vec<FieldValues<'r>>
}
#[derive(Deserialize)]
#[serde(crate = "rocket::serde")]
#[derive(Debug)]
struct FieldValues<'r> {
name: &'r str,
value: &'r str,
}
并在这样的 API 端点中使用它们:
#[post("/<index_name>", format="json", data="<message>")]
async fn new_document(message: Json<PostDocument<'_>>, index_name: &str) -> Json<AddDocumentResponse> {
// code
}
代码无法编译,尽管抱怨生命周期de the serde deserializer apparently creates, and that de 必须比 `r 长。这是完整的错误消息:
error: lifetime may not live long enough
--> src/add_file.rs:18:5
|
14 | #[derive(Deserialize)]
| ----------- lifetime `'de` defined here
...
17 | struct PostDocument<'r> {
| -- lifetime `'r` defined here
18 | fields: Vec<FieldValues<'r>>
| ^^^^^^ requires that `'de` must outlive `'r`
|
= help: consider adding the following bound: `'de: 'r`
A:我不确定在何处或如何指定边界:'de: 'r(我是生锈的新手,我不熟悉这种语法,而且我无法在文档中找到对它的引用)
B:我在其他文件中编写了其他端点,这些文件定义了非常相似的结构,似乎没有问题。代码本身简单地循环 Vec 并将每个添加到一个 tantivy 文档中。如果我完全注释掉使用该参数的方法主体中的所有代码,错误仍然存在。
C:如果我添加一个名为“de”的生命周期参数,编译器会抱怨说如果存在一个名为“de”的生命周期参数,它就无法反序列化。
【问题讨论】:
标签: rust rust-rocket