无法将闭包作为参数传递

时间:2015-06-27 18:05:22

标签: closures rust

我现在正在学习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,第一个例子是有效的,所以这个“闭包类型参数”语法被删除了,或者我只是做错了什么?

2 个答案:

答案 0 :(得分:7)

Rust从一开始就在开放中开发,从那以后语言已经发展了很多。您链接的Stack Overflow文章差不多有1年的历史,在1.0之前的生锈时间与生命周期一样长...(双关语)

最直接的答案是:请记住,很多文章,博客帖子,SO答案......都不再相关,因为语言发生了变化。如果你尝试一个解决方案并且它不起作用,只需找到更新的语法(正如你所做的那样!)并继续前进。

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

顺便说一句,有一个社区努力的计划是找到过时的文章并明确地将它们标记为已弃用,以便避免这个特定的问题。但是,我无法找到它的链接。

答案 1 :(得分:6)

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

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);
}

你应该更喜欢前者。