Можем ли мы реализовать черту для всех структур нового типа, содержащих определенный тип? - PullRequest
0 голосов
/ 25 сентября 2019

У нас есть impl<T> Trait for Vec<T>, который может реализовать Trait для всех Vec<_>.Можем ли мы иметь то же самое для структуры нового типа (структура кортежа только с одним значением)?Например:

impl<T> Trait for T(SomeType) {}

Почему?

В DDD каждый агрегатный корень / сущность имеет тип Id:

struct BookId(Uuid);

struct Book {
    id: BookId,
    // ...
}

struct LibraryId(Uuid);

struct Library {
    id: LibraryId,
    // ...
}

Я думаю, что это естественноспособ сделать моделирование, но если вы делаете это, трудно реализовать черту для всех типов идентификаторов.Примером черты являются черты FromSql и ToSql в rust-postgres.

Вместо этого мы должны сделать это:

impl ToSql for BookId {
    to_sql_checked!();

    accepts!(UUID);

    fn to_sql(&self, ty: &Type, w: &mut Vec<u8>) -> Res<IsNull> {
        self.to_id().to_sql(ty, w)
    }
}

impl<'a> FromSql<'a> for BookId {
    accepts!(UUID);

    fn from_sql(_: &Type, raw: &[u8]) -> Res<BookId> {
        let uuid = types::uuid_from_sql(raw)?;
        Ok(BookId::new(Uuid::from_bytes(uuid)))
    }
}

// same thing for LibraryId

Не так чисто, а?Есть ли способ сделать код чище?

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