У нас есть 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
Не так чисто, а?Есть ли способ сделать код чище?