не могу так писать. Но мне хочется передавать в функцию объект, реализующий два трейта, а внутри функции вызывать другие функции, специфические для каждого трейта. Можно ли сделать так, чтобы функция dummy_a компилировалась без использования unsafe кастов и <T: A + B>?
Ссылка на код - https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=196ad521dc662714f37b4f1ef59fb060
Дженерики в помощь
Надо в trait B запихнуть метод для upcast к A. Это делается без unsafe добавлением небольшого бойлерплейта. Почитать, например, можно тут https://articles.bchlr.de/traits-dynamic-dispatch-upcasting
Эхъ. fn as_mut_b<'a, 'b, T: A + ?Sized>(a: &'a mut &'b mut T) -> &'a mut (impl 'b + B) { use ref_cast::RefCast; #[derive(RefCast)] #[repr(transparent)] struct Bw<'b, T: ?Sized>(&'b mut T); impl<T: A + ?Sized> B for Bw<'_, T> { fn b(&self) { self.0.b(); } } Bw::<'b, T>::ref_cast_mut(a) } И потом dummy_b(b(&mut a))
Обсуждают сегодня