Как написать признак, связанный для ссылки на связанный тип на самой особенности? - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть этот код:

extern crate serde;

use serde::de::DeserializeOwned;
use serde::Serialize;

trait Bar<'a, T: 'a>
where
    T: Serialize,
    &'a T: DeserializeOwned,
{
}

Я хотел бы написать это, используя связанный тип, потому что тип T не важен для пользователей этого типа. Я получил это далеко:

trait Bar {
    type T: Serialize;
}

Я не могу понять, как указать другую границу.

В конечном счете, я хочу использовать такую ​​функцию:

extern crate serde_json;

fn test<I: Bar>(t: I::T) -> String {
    serde_json::to_string(&t).unwrap()
}

1 Ответ

0 голосов
/ 29 апреля 2018

«Правильным» решением является размещение границ для черты, но с указанием связанного типа. В этом случае вы также можете использовать границы черты с более высоким рейтингом для обработки ссылки:

trait Bar
where
    Self::T: Serialize,
//  ^^^^^^^ Bounds on an associated type  
    for<'a> &'a Self::T: DeserializeOwned,
//  ^^^^^^^^^^^ Higher-ranked trait bounds       
{
    type T;
}

Однако это пока не работает.

Я считаю, что вам нужно либо:

Тем временем, обходной путь должен дублировать границы везде, где это необходимо:

fn test<I: Bar>(t: I::T) -> String
where
    for<'a> &'a I::T: DeserializeOwned,
{
    serde_json::to_string(&t).unwrap()
}
...