У меня есть следующие две структуры, для которых я получаю черты serde.
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
pub struct Item<'a> {
pub id: &'a str,
pub name: &'a str
}
#[derive(Serialize, Deserialize)]
struct Set<'a> {
items: Vec<Item<'a>>
}
Когда я пытаюсь скомпилировать это, я получаю следующее сообщение об ошибке, чтобы убедиться, что параметр времени жизни 'de
из Deserialize
должен пережить параметр времени жизни 'a
:
15 | #[derive(Serialize, Deserialize)]
| ----------- lifetime `'de` defined here
16 | struct Set<'a> {
| -- lifetime `'a` defined here
17 | sets: Vec<Item<'a>>
| ^^^^ requires that `'de` must outlive `'a`
|
= help: consider adding the following bound: `'de: 'a`
Но когда я добавляю требуемую границу следующим образом, я получаю сообщение об ошибке, что 'de
не используется.
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
pub struct Item<'a> {
pub id: &'a str,
pub name: &'a str
}
#[derive(Serialize, Deserialize)]
struct Set<'a, 'de: 'a> {
items: Vec<Item<'a>>
}
16 | struct Set<'a, 'de: 'a> {
| ^^^ unused parameter
|
= help: consider removing `'de`, referring to it in a field, or using a marker such as `PhantomData`
Как я могу это исправить?
В поле sets
нужно добавить #[serde(заимствовать)]:
#[derive(Serialize, Deserialize)]
struct Set<'a> {
#[serde(borrow)]
items: Vec<Item<'a>>,
}
Это ограничит время жизни 'de
в сгенерированном коде на 'a
. Обратите внимание, что это происходит неявно для полей типа &str
или &[u8]
, но для всего остального вам нужно явно запрашивать привязку типажа.
Джинкс, ты прав, твой ответ лучше.