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) }
    }
}