函数指针与FN特征对象 [英] function pointer vs Fn trait object
本文介绍了函数指针与FN特征对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
fn do_twice(f: fn(i32) -> i32, arg: i32) -> i32 { // definition
f(arg) + f(arg)
}
do_twice(|x| x + 1, 5) // call
此函数同时接受、闭包和函数指针。它以函数指针作为参数类型。
什么时候我应该更喜欢使用特征对象,如&dyn Fn(i32) -> i32
或Box<dyn Fn(i32)-> i32>
而不是fn
fn do_twice(f: &dyn Fn(i32) -> i32, arg: i32) -> i32 { // definition
f(arg) + f(arg)
}
do_twice(&|x| x + 1, 5) // call
或
fn do_twice(f: Box<dyn Fn(i32) -> i32>, arg: i32) -> i32 { // definition
f(arg) + f(arg)
}
推荐答案
fn
类型为裸函数指针(https://doc.rust-lang.org/std/primitive.fn.html)。
它不能与捕获环境的闭包一起工作,也不能为您喜欢的类型(如impl Fn for MySuperType
)手动实现它
所以你的例子有效的唯一原因就是它过于简单化了!
如果再复杂一点,它将失败https://gist.github.com/rust-play/2167e73325daa1e2a179505209405917
这篇关于函数指针与FN特征对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文