首页 > 解决方案 > 如何通过对象安全方法中的动态调度传递闭包?

问题描述

如何将闭包传递给对象安全的 trait 方法或通过动态调度?

我自己已经回答了这个问题,但答案留下了一些不足:FnOnce闭包必须装箱,因为它们没有尺寸并且必须在使用时消耗(因此不能通过引用传递)。

标签: rustclosurestraitstrait-objects

解决方案


您可以在不使用的情况下通过它Box

fn pass_fn_once(do_thing: &dyn FnOnce()) {
    //do_thing();
}

fn main() {
    pass_fn_once(&|| println!("Hello!"));
}

但是,您将无法真正调用do_thingin pass_fn_once,因为它只是借用的 -调用 anFnOnce会消耗它

如果它们被Boxed,您可以确定它pass_fn_once取得了所有权,以便之后可以丢弃关闭。


推荐阅读