Вы не правильно указали полные границы для связанных типов.
Json
реализует только IntoResponse
, когда содержащийся в нем тип реализует как Send
, так и Serialize
:
impl<T: Send + Serialize> IntoResponse for Json<T>
Вам необходимо включить Send
в границы для связанных типов:
trait IntoPrimaryData: Send {
type Attrs: serde::Serialize + Send;
// ^^^^^^
type Rels: serde::Serialize + Send;
// ^^^^^^
fn into_primary_data(self) -> PrimaryData<Self::Attrs, Self::Rels>;
}
Шаги отладки
Эта строка сообщения об ошибке показаласьОбещание:
the method `with_status` exists but the following trait bounds were not satisfied:
`tide::body::Json<Document<<T as IntoPrimaryData>::Attrs, <T as IntoPrimaryData>::Rels>> : tide::response::IntoResponse`
Это говорит о том, что мы можем вызвать with_status
, за исключением того, что компилятор не знал, что тип реализовал черту.Оттуда я перешел к документации Json
, чтобы узнать, реализовано ли оно IntoRespose
и, если да, при каких условиях:
impl<T: Send + Serialize> IntoResponse for Json<T>
Исходя из этого, мы знаем, чтоэто T
должно быть PrimaryData<T::Attrs, T::Rels>
, и оно должно реализовывать Send + Serialize
.
Мы видим, что PrimaryData
выводит Serialize
:
#[derive(Serialize)]
struct PrimaryData<Attrs, Rels> {
Из имеющихся знаний я знаю, что большинство derive
d черт требуют, чтобы все универсальные типы также реализовывали черту,Это менее очевидно, но то же самое верно для Send
.
Оттуда нужно доказать, что конкретные типы для Attrs
и Rels
реализуют Serialize
и Send
.Связанные границы типов обрабатывают одну, но не другую.
Решение о том, где разместить границы, зависит от намерения и стиля - они могут идти по функции, блоку impl
или по признаку.Поскольку в признаке уже упоминалось Serialize
, казалось, что это естественное место для добавления дополнительной границы.
Я также сделал одну большую ошибку - я предположил, что вы правильно указали границы и столкнулись с ограничение компилятора ( также ).Только когда я попытался применить предложенный дубликат, я понял, что границы были неправильными.
См. Также: