如何将闭包传递给对象安全的 trait 方法或通过动态调度?
我自己已经回答了这个问题,但答案留下了一些不足:FnOnce
闭包必须装箱,因为它们没有尺寸并且必须在使用时消耗(因此不能通过引用传递)。
如何将闭包传递给对象安全的 trait 方法或通过动态调度?
我自己已经回答了这个问题,但答案留下了一些不足:FnOnce
闭包必须装箱,因为它们没有尺寸并且必须在使用时消耗(因此不能通过引用传递)。
您可以在不使用的情况下通过它Box
:
fn pass_fn_once(do_thing: &dyn FnOnce()) {
//do_thing();
}
fn main() {
pass_fn_once(&|| println!("Hello!"));
}
但是,您将无法真正调用do_thing
in pass_fn_once
,因为它只是借用的 -调用 anFnOnce
会消耗它。
如果它们被Box
ed,您可以确定它pass_fn_once
取得了所有权,以便之后可以丢弃关闭。
Fn
和FnMut
闭包可以通过引用传递,如下所示。FnOnce
可以通过引用传递但不能调用,除非它是拥有的,例如由 a拥有Box
。
fn pass_fn(get_num: &dyn Fn() -> i32) {
let _num = get_num();
}
fn pass_fn_mut(set_num: &mut dyn FnMut(i32)) {
set_num(6);
}
fn pass_fn_once(do_thing: Box<dyn FnOnce()>) {
do_thing();
}
fn main() {
pass_fn(&|| 2);
let mut x = 1;
pass_fn_mut(&mut |y| x = y);
pass_fn_once(Box::new(|| println!("Hello!")));
}