¿Cómo llamar a un método que se consume en un objeto de rasgo en caja?
Tengo el siguiente boceto de una implementación:
trait Listener {
fn some_action(&mut self);
fn commit(self);
}
struct FooListener {}
impl Listener for FooListener {
fn some_action(&mut self) {
println!("{:?}", "Action!!");
}
fn commit(self) {
println!("{:?}", "Commit");
}
}
struct Transaction {
listeners: Vec<Box<Listener>>,
}
impl Transaction {
fn commit(self) {
// How would I consume the listeners and call commit() on each of them?
}
}
fn listener() {
let transaction = Transaction {
listeners: vec![Box::new(FooListener {})],
};
transaction.commit();
}
yo puedo tenerTransaction
s con oyentes que llamarán al oyente cuando ocurra algo en esa transacción. Ya queListener
es un rasgo, guardo unVec<Box<Listener>>
.
Estoy teniendo dificultades para implementarcommit
paraTransaction
. De alguna manera tengo que consumir las cajas llamandocommit
en cada uno de los almacenadosListener
s, pero no puedo mover cosas de una caja por lo que sé.
¿Cómo consumiría a mis oyentes en commit?