[英]How to pass a function as parameter in another function?
我坚持将 function 作为参数传递:
fn first(
a: *mut *const u8
) -> c_int;
fn second(
b: u16,
functionfirst: first()
) -> c_int;
我得到的错误是:
error[E0573]: expected type, found function `first` functionfirst: first() ^^^^ not a type
我尝试了什么:
type first = Option<unsafe extern "C" fn(a: *mut *const u8) -> c_int>;
unsafe extern "C" fn second(
b: u16,
functionfirst: first
) -> c_int;
这也有一个错误:
error: expected `;`, found `=` type first = Option<unsafe extern "C" fn(a: *mut *const u8) -> c_int>; ^ expected `;`
您只是突然倾倒声明,因此有点难以理解您的实际目标是什么。 此外,这不仅仅是使用 Rust 函数的 Rust 代码,这似乎是 FFI 并将 Rust 与其他一些系统连接
fn first(a: *mut *const u8) -> c_int; fn second(b: u16, functionfirst: first()) -> c_int;
参数类型需要是类型, first()
不是类型,它是一个 function(调用)。 function 指针的类型是fn(args…) -> result
。 尽管这告诉 rustc 使用 Rust 调用约定,但考虑到所涉及的非 Rust 类型(尽管 rust 和非 rust 数字类型的混合听起来是个坏主意),您可能需要一个extern
来确保正确的 ABI:
fn second(
b: u16,
functionfirst: extern fn(*mut *const u8) -> c_int
) -> c_int;
我尝试了什么:[...] 这也有一个错误:
提供完整的代码和错误(也就是最小的可重现示例)往往很有用,因为虽然我确实收到了您的代码段错误,但它与您获得的代码无关。
我只是得到一个错误,一个免费的 function 需要一个主体,这可以通过将声明放在一个extern
块中来解决(表明我们正在声明一个由其他东西提供的 function,而不是定义一个函数),然后编译器抱怨关于unsafe
的,因为extern
块不允许unsafe
(因为在其中声明的函数根据定义是不安全的)。
在解决了这些问题之后,两者都进行编译,但价值不大: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=67e75201f7c2d8fa9bd474c6615cd414
要将 function 传递给 Rust 中的另一个 function,请使用具有特征绑定的通用参数。 最基本的例子是:
fn hi_5<F>(func: F) where F: Fn(u32) -> u32, {
println!("Hi, {}", func(5));
}
fn square(x: u32) -> u32 {
x*x
}
hi_5(square);
为了打破这一点,我们在这里声明了一个名为hi_5
( fn hi_5
) 的 function,它有一个泛型参数 F ( <F>
) 并接受一个 F 类型的参数 ( func: F
)。 F 泛型类型绑定了一个Fn(u32) -> u32
特征( where F: Fn(u32) -> u32
),这意味着它是一个u32
,它接受一个 u32 并返回一个u32
。
在 Rust 中有三个Fn
特征,尽管它们仅在处理闭包时才重要。
Fn
特征是您最常使用的特征。 它从环境中不可变地借用所有变量。FnMut
trait 可变地借用环境,这意味着它可以改变其值。FnOnce
trait 将使用的环境变量移动到闭包中。 Once
部分来自这样一个事实,即在调用 function 之后,它不能再次被调用。如果您不了解“环境”是什么,请查看Rust 书中关于闭包的章节。
受Iterator::find sources 的启发。
fn find<P>(mut predicate: P)
where
P: FnMut(&str) -> bool,
{
predicate("x");
}
fn main() {
find(|x| {println!("Printed {}", x); return true; });
}
Fn :-
采用不可变接收器的呼叫运算符版本。 可以重复调用 Fn 的实例而不会改变 state。
FnMut :-
采用可变接收器的呼叫运算符版本。 FnMut 的实例可以重复调用,并且可能会改变 state。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.