у меня возник вопрос. Есть анти-паттерн Deref polymorphism https://rust-unofficial.github.io/patterns/anti_patterns/deref.html. И есть NewType, который часто нужен, но требует много бойлерплейта.
Вопрос - является ли использование Deref/DerefMut для неявного вытаскивания обёрнутого типа в NewType всё ещё анти-паттерном, или так можно делать / все делают? Например:
pub struct NotEmptyVec(Vec<u8>);
impl Deref for NotEmptyVec {
type Target = Vec<u8>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
Мне кажется, что да, так как ты теряешь при дереференсе информацию, что твой тип не пуст Стандартные NonZero числа релаизуют метод get для передачи значения
https://stackoverflow.com/questions/45086595/is-it-considered-a-bad-practice-to-implement-deref-for-newtypes DerefMut позволит нарушить любые гарантии, для которых предназначен ньютайп. С Deref может быть то же из-за interior mutability. Если таких проблем, то ИМХО это удобный способ.
also, если только Deref, то лучше сделать type Target = [u8];
Обсуждают сегодня