gpt4 book ai didi

rust - fn item 和 fn pointer 之间的实际区别是什么?

转载 作者:行者123 更新时间:2023-12-03 11:33:08 27 4
gpt4 key购买 nike

fn func(_: i64) -> bool {
true
}

fn func_of_func(callback: &fn(i64) -> bool, arg: i64) -> bool {
(*callback)(arg)
}

fn main() {
let is_positive = &func;
println!("{}", func_of_func(is_positive, 8));
println!("{}", func_of_func(is_positive, 8));
}

这不编译:

error[E0308]: mismatched types
--> src/main.rs:9:33
|
9 | println!("{}", func_of_func(is_positive, 8));
| ^^^^^^^^^^^ expected fn pointer, found fn item
|
= note: expected reference `&fn(i64) -> bool`
found reference `&fn(i64) -> bool {func}`

为什么当我传递了一个指针而不是 fn 时会发生此错误?我想知道使用 fn 和指向 fn 的指针之间的实际区别。

最佳答案

fn(i64) -> boolalready a function pointer , 所以 &fn(i64) -> bool 是对函数指针的引用。由于函数指针是 Copy,因此您绝对没有理由编写此代码。

如果你正在编写一个函数,它接受类似函数的东西作为参数,你通常应该使用泛型(或 impl Fn,如 Mike Graham's answer ,意思相同):

fn func_of_func<F: FnOnce(i64) -> bool>(callback: F, arg: i64) -> bool {
callback(arg)
}

这意味着当你用func这样的函数项调用func_of_func时,callback会被编译成一个直接的函数调用,而不是一个函数指针,编译器更容易优化。

如果函数不能被通用化(可能因为它是对象安全特征的成员),你通常应该使用特征对象来代替,它允许调用者传递一个闭包:

fn func_of_func(callback: &dyn Fn(i64) -> bool, arg: i64) -> bool { ... }
fn func_of_func(callback: &mut dyn FnMut(i64) -> bool, arg: i64) -> bool { ... }
// using `FnOnce` requires boxing
fn func_of_func(callback: Box<dyn FnOnce(i64) -> bool>, arg: i64) -> bool { ... }

只有当函数绝对不能捕获任何东西时才应该使用函数指针。它们主要用于使用 C 的 FFI,并作为通用结构中 PhantomData 的类型参数。

引用资料

关于rust - fn item 和 fn pointer 之间的实际区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64438613/

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