Derive + Generic структури
Защо в задачата от упр. 09 имплементираме Clone на ръка, а не използваме анотация #[derive(Clone)]?
Когато използваме #[derive(SomeTrait)] върху структура с generic параметър, напр. MyStruct<T>, бихме могли да имаме в предвид едно от две неща:
- генерирай
impl<T> SomeTrait for MyStruct<T> - генерирай
impl<T> SomeTrait for MyStruct<T> where T: SomeTrait
И двете са валидни в различни ситуации и компилатора няма как да отгатне кое се очаква.
Избрано е derive да генерира втория вариант. (Не намирам информация защо е избрано така.)
Конкретно, използването на derive би генерирало следния код, което не е каквото искаме.
#[derive(Clone)]
pub struct EventDispatcher<S> {
inner: Arc<Mutex</* ...data... */>>,
}
// генериран код
impl<S> Clone for EventDispatcher<S>
where
S: Clone,
{
fn clone(&self) -> Self {
EventDispatcher { inner: Arc::clone(&self.inner) }
}
}
Клонирането на EventDispatcher, който е някакъв вид handle, няма нужда да зависи от типа S. Затова коректното решение е да си имплементираме Clone на ръка
pub struct EventDispatcher<S> {
inner: Arc<Mutex</* ...data... */>>,
}
impl<S> Clone for EventDispatcher<S> {
fn clone(&self) -> Self {
EventDispatcher { inner: Arc::clone(&self.inner) }
}
}
