函数指针与FN特征对象 [英] function pointer vs Fn trait object

查看:14
本文介绍了函数指针与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) -> i32Box<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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆