将变量传递到生锈的范围

Pass variable into a scope in rust

我在尝试在 Rust 中实现过滤器方法的回调时遇到问题。我有这个功能:

fn filter_by_mod(num: i32) -> fn(x: &i32) -> bool {
    let func = |x: &i32| {
        x.to_owned() % num == 0
    };
    return func;
}

我正在尝试按 mod 进行过滤,我想通过参数传递数字并在 func clousure 中使用,但是当我尝试编译时出现以下错误:

fn filter_by_mod(num: i32) -> fn(x: &i32) -> bool {
   |                                 ------------------- expected `for<'r> fn(&'r i32) -> bool` because of return type
9  |       let func = |x: &i32| {
   |  ________________-
10 | |         x.to_owned() % num == 0
11 | |     };
   | |_____- the found closure
12 |       return func;
   |              ^^^^ expected fn pointer, found closure
   |
   = note: expected fn pointer `for<'r> fn(&'r i32) -> bool`
                 found closure `[closure@.\main.rs:9:16: 11:6]`
note: closures can only be coerced to `fn` types if they do not capture any variables
  --> .\main.rs:10:24
   |
10 |         x.to_owned() % num == 0
   |                        ^^^ `num` captured here

error: aborting due to previous error

如何将数字传递给 func 作用域?我希望你能理解我,因为我的英语不好。谢谢

这里发生了两件事:

  • 您需要 num 移动到新函数
  • 你的函数签名错误,你不能return一个函数指针,你需要使用impl + 需要函数特征签名。

还有细微的时尚调整:

fn filter_by_mod(num: i32) -> impl Fn(&i32) -> bool {
    move |x: &i32| {
        x.to_owned() % num == 0
    }
}

Playground

示例编译不通过有两个问题:

  • 您正在 returning fn 类型。在 Rust 中它是一个函数指针,但闭包不是函数,所以你需要 return Fn 特征的实现。
  • 但是默认闭包借用了context参数,所以需要移动它:
fn filter_by_mod(num: i32) -> impl Fn(&i32) -> bool {
    let func = move |x: &i32| {
        x.to_owned() % num == 0
    };
    return func;
}