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

问题描述 投票:0回答:1

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

我可以自己回答这个问题,但是答案还有些不足:FnOnce闭包必须装箱,因为它们没有大小,必须在使用时使用(因此不能通过引用传递。)>

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!")));
}

如何将闭包传递给对象安全的特征方法,或者通过动态调度?我可以自己回答这个问题,但是答案却有些不足:FnOnce闭包必须用盒装,因为它们...

rust closures traits trait-objects
1个回答
0
投票

FWIW,您可以不带框地传递它:

© www.soinside.com 2019 - 2024. All rights reserved.