У меня есть черта DoSomethingProvider
, которая ожидает, что параметр одной из ее функций будет иметь тип черты DoSomethingListener
.
У меня есть конкретная структура DoSomethingManager
, которая имеет член типа DoSomethingProvider
и реализует черту DoSomethingListener
и передает ее в качестве слушателя DoSomethingProvider
.
Надеюсь, код покажет, что я пытаюсь сделать:
pub trait DoSomethingListener {
fn something_was_done(msg: &str);
}
pub trait DoSomethingProvider<'a, T>
where
T: DoSomethingListener,
{
fn add_do_something_listener(listener: T);
}
/* note: The struct below will implement DoSomethingListener, and has
* a DoSomethingProvider field. It will pass itself as a listener to
* DoSomethingProvider (which listens to a message queue and notifies
* listeners of certain events)
*/
//this doesn't work. Compiler complains about unused type T
pub struct DoSomethingManager<'a, B, T>
where
T: DoSomethingListener,
B: DoSomethingProvider<'a, T>,
{
provider: Box<B>,
// doesn't have any member of type T
}
// ...
/* So I tried this:
* this doesn't work. Compiler complains that DoSomethingProvider
* expects one type parameter
*/
pub struct DoSomethingManager<'a, B>
where
B: DoSomethingProvider<'a>,
{
provider: Box<B>,
// doesn't have any member of type T
}
//...
/* this compiles, but its a hack */
pub struct DoSomethingManager<'a, B, T>
where
T: DoSomethingListener,
B: DoSomethingProvider<'a, T>,
{
provider: Box<B>,
dummy: Box<T>,
// added unused dummy member of type T
}
Я опытный разработчик Python, но я новичок в Rust.Как правильно реализовать этот полиморфный код в Rust?