【问题标题】:Cannot pass closure as parameter [duplicate]无法将闭包作为参数传递[重复]
【发布时间】:2015-09-14 12:13:42
【问题描述】:

我现在正在学习 Rust,似乎我无法将闭包指定为函数参数。这是我所拥有的:

fn foo(a: i32, f: |i32| -> i32) -> i32 {
    f(a)
}

fn main() {
    let bar = foo(5, |x| { x + 1 });
    println!("{}", bar);
}

我收到以下错误:

foo.rs:1:19: 1:20 error: expected type, found `|`
foo.rs:1 fn foo(a: i32, f: |i32| -> i32) -> i32 {

好的,所以它不喜欢闭包语法。这有点烦人,因为现在我必须写这个:

fn foo(a: i32, f: Box<Fn(i32) -> i32>) -> i32 {
    f(a)
}

fn main() {
    let bar = foo(5, Box::new(|x| { x + 1 }));
    println!("{}", bar);
}

那么发生了什么?我在几个不同的places 中读到第一个示例是有效的,那么这个“闭包类型参数”语法是被删除了,还是我只是做错了什么?

【问题讨论】:

    标签: closures rust


    【解决方案1】:

    如果今天有人对这个问题感兴趣,这里是泛型的语法:

    fn foo<F: Fn(i32) -> i32>(a: i32, f: F) -> i32 {
        f(a)
    }
    
    fn main() {
        let bar = foo(5, |x| { x + 1 });
        println!("{}", bar);
    }
    

    或者,使用特征对象:

    fn foo(a: i32, f: Box<Fn(i32) -> i32>) -> i32 {
        f(a)
    }
    
    fn main() {
        let bar = foo(5, Box::new(|x| { x + 1 }));
        println!("{}", bar);
    }
    

    你应该更喜欢前者。

    【讨论】:

      【解决方案2】:

      Rust 从一开始就是公开开发的,从那时起该语言已经发展了很多。您链接到的 Stack Overflow 文章已经有将近 1 年的历史了,在 Rust 1.0 之前的时间里,它的时间和一生一样长......(双关语)

      最直接的答案是:请记住,由于语言发生了变化,许多文章、博客文章、SO 答案......不再相关。如果您尝试了一个解决方案但它不起作用,只需找到更新的语法(就像您所做的那样!)并继续。

      对于这种特定情况,this RFC 记录了从 |...| -&gt; ...Fn/FnMut/FnOnce(...) -&gt; ... 的更改。

      顺便说一句,为了避免这个特殊问题,社区有一个计划来查找过时的文章并将它们明确标记为已弃用。但是我找不到它的链接。

      【讨论】:

      • RFC 114 比 RFC 231 与此更改更相关,但 RFC 114 的详细信息不是最新的(例如,Fn 现在是 FnMutFnShare 现在是 @987654328 @)。
      • 明确地将它们标记为已弃用 - 或者只是要求其他回答者更新答案 ^_^。我这样做了,它在几分钟内得到了更新。现在,是否应该将此问题标记为重复?
      • 我没有想到 SO,而是博客文章,其中的内容不可社区更新。它甚至可能是不可取的;例如,Niko Matsakis 的博客文章更多地是关于思考过程的——您可以将其作为历史参考而不是最新文档。
      • 关于重复,如果您相信,请随时标记;我个人不同意,因为真的,这个问题真的不是关于闭包,而是实际上问“嘿,这里真的有过时的信息吗?如何处理它?”,链接中没有解决问题。
      猜你喜欢
      • 2011-04-30
      • 2014-03-07
      • 1970-01-01
      • 2019-11-01
      • 2014-04-22
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 2021-04-25
      相关资源
      最近更新 更多