gpt4 book ai didi

rust - 应该将 Rust 闭包作为 Box 还是作为 &impl(Fn...) 传递?

转载 作者:行者123 更新时间:2023-12-05 02:26:22 28 4
gpt4 key购买 nike

看起来 Rust 中的函数可以将闭包作为 Box 的参数:

closure: Box<dyn Fn()>

或作为&impl:

closure: &impl Fn()

两者有什么区别?有没有比另一个更推荐的?

最佳答案

Box<dyn Fn()>在堆上分配,并使用动态调度

在堆上分配比堆栈分配更昂贵 - 必须在运行时为对象分配内存。

动态调度意味着要运行的实际函数是在运行时确定的,而不是编译时。

impl Fn() , 用于函数参数位置时,is equivalent to using a generic parameter .例如,这个:

foo(f: impl Fn())

相当于:

foo<F: Fn()>(f: F)

这样定义,Rust 将使用static dispatch。这意味着它将在编译时为传递给它的每个具体类型生成一个函数版本。这是用较大的编译代码大小换取较低的运行时成本,因为它不需要在运行时确定要调用哪个函数。

大多数时候,编写一个接受 impl Fn() 的函数或等效的通用形式将是首选,因为它会带来更好的运行时性能。

盒装闭包也实现了 Fn()所以这有效:

fn foo(f: impl Fn()) {
f();
}

fn main() {

let f = Box::new(|| println!("Hello"));
foo(f);

foo(|| println!("world"));

}

编写函数以获取 impl Fn()是最灵活的,因为它可以采用任何一种参数形式。

请注意,使用 impl Fn()返回位置是different .

还要注意 Box<dyn Fn()>impl Fn()按值(value)传递,因此他们转移了闭包的所有权。 &impl Fn()通过引用传递 - 等效的盒装闭包将是 &Box<dyn Fn()> .

关于rust - 应该将 Rust 闭包作为 Box<dyn Fn...> 还是作为 &impl(Fn...) 传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73807583/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com