¿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 tenerTransactions 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 almacenadosListeners, pero no puedo mover cosas de una caja por lo que sé.

¿Cómo consumiría a mis oyentes en commit?

Respuestas a la pregunta(1)

Su respuesta a la pregunta