繁体   English   中英

如何将 function 作为参数传递给另一个 function?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM