Характеристика RestPath для специализации ArrayVec <> - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть определенные типы, а затем я сохраняю их в переменных типа ArrayVec<[MyType, 16]> (из arrayvec ящик) (членов структуры). Restson имеет черту RestPath, что позволяет нам определять путь, используемый для формирования URI при выполнении запроса REST.

Однако из-за ограничения, котороедля произвольных типов могут быть реализованы только локальные черты (AKA - сиротское правило). Я не могу использовать это прямо для ArrayVec<[MyType, 16]>.

. Я как-то преодолел эту проблему, реализовав черту для ~ специализации ~ реализации следующихenum:

enum ModelArray<T> {
    Array(T)
}

, а затем decorticate экземпляр T, используя:

type MyArray = ModelArray<ArrayVec<[MyType; 16]>>;

let encapsulated_array: MyArray = client.get(()).unwrap();

let ModelArray::<ArrayVec<[MyType; 16]>>::Array(myarray) = encapsulated_array;

Это работает как минимальный пример, но я страдаю от того факта, что яЯ не могу вызвать client.get(()).unwrap() напрямую члену другой структуры.

Я удивлен, что полная специализация универсального типа не обрабатывается Rust, поскольку локальный тип и правило-сирота все еще применяются.Почему?

Существуют ли другие приятные способы преодоления ограничения, и я позволил бы мне аккуратно назначить результат get() Restson на элементы структуры?


Рабочий код:

extern crate restson;
extern crate arrayvec;
extern crate serde_derive;

use restson::RestPath;
use arrayvec::ArrayVec;

#[derive(Deserialize, Debug)]
struct MyType {
    id: u16,
    data: u32,
}

struct DataModel {
    my_data: ArrayVec<[MyType; 16]>
}

#[derive(Deserialize, Debug)]
#[serde(untagged)]
enum ModelArray<T> {
    Array(T)
}

impl RestPath<u16> for MyType {
    fn get_path(id: u16) -> Result<String, Error> {
        Ok(format!("data/MyType/{}", id))
    }
}

impl RestPath<()> for ModelArray<ArrayVec<[MyType; 16]>> {
    fn get_path(_: ()) -> Result<String, Error> {
        Ok(String::from("data/MyType"))
    }
}

use restson::RestClient;

pub fn load_data() {
    let mut client = RestClient::new(&format!("http://{}", "localhost:8080")).unwrap();

    let element: Type = client.get(24).unwrap();
    println!("Room: {:?}", elementh);

    type ModelArray = ModelArray<ArrayVec<[MyType; 16]>>;
    let encapsulated: ModelArray = client.get(()).unwrap();
    let ModelArray::<ArrayVec<[MyType; 16]>>::Array(elements) = encapsulated;
    println!("Room: {:?}", elements[0]);
}

На Rust Playground (отсутствие restson ящика не позволило бы вам построить)

Соответствующий полный код: на GitHubGist

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...