Como chamar um método que se consome em um objeto de característica em caixa?

Eu tenho o seguinte esboço de uma implementação:

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

eu posso terTransactions com ouvintes que chamarão o ouvinte quando algo acontecer nessa transação. Desde aListener é uma característica, eu guardo umVec<Box<Listener>>.

Estou tendo dificuldades para implementarcommit paraTransaction. De alguma forma eu tenho que consumir as caixas chamandocommit em cada um dosListeners, mas não consigo mover coisas de uma caixa até onde sei.

Como eu consumiria meus ouvintes no commit?

questionAnswers(1)

yourAnswerToTheQuestion