Проблема времени жизни десериализации Rust: «de должен пережить»

У меня есть следующие две структуры, для которых я получаю черты 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`

Как я могу это исправить?

Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
1
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В поле sets нужно добавить #[serde(заимствовать)]:

#[derive(Serialize, Deserialize)]
struct Set<'a> {
    #[serde(borrow)]
    items: Vec<Item<'a>>,
}

Это ограничит время жизни 'de в сгенерированном коде на 'a. Обратите внимание, что это происходит неявно для полей типа &str или &[u8], но для всего остального вам нужно явно запрашивать привязку типажа.

Джинкс, ты прав, твой ответ лучше.

cafce25 21.11.2022 11:26

Другие вопросы по теме