Rust: как получить Deserialize для структуры с универсальными типами?

#[derive(Deserialize)]
struct S<'d, T>
  where T: Deserialize<'d>
{
  foo: T,
  other_field: String
}

Приведенный выше код не компилируется, жалуется на неиспользуемый параметр времени жизни, но если я его удалю, Deserialize будет отсутствовать время жизни.

Можно ли исправить приведенный выше код без использования фантомного маркера или DeserializeOwned?


person Incömplete    schedule 19.05.2021    source источник


Ответы (1)


Код работает, если полностью удалить предложение where. Привод автоматически добавит T: Deserialize<'de> привязку для производной Deserialize<'de> реализации.

#[derive(Deserialize)]
struct S<T> {
  foo: T,
  other_field: String
}

В Rust общие типы обычно не ограничиваются объявлениями struct / enum. Общий тип ограничен только для impl блоков, где требуется поведение.

person jonasbb    schedule 19.05.2021