是否可以返回Rust闭包而不使用Box来返回闭包?

时间:2018-09-29 13:07:35

标签: rust closures

很容易将内部闭合包装在Box中:

fn add1() -> impl Fn(i32) -> Box<Fn(i32) -> i32> {
    |x| Box::new(|y| x + y)
}

但是是否有必要使用Box?在以下代码中:

fn add2() -> ?? {
    |x: i32| move |y: i32| x + y
}

我可以用一些东西代替??来检查代码类型吗?

1 个答案:

答案 0 :(得分:3)

不。如您所知,impl Trait是一种无需装箱即可返回特征实例的机制。

如果您尝试扩展此范围:

fn add2() -> impl Fn(i32) -> impl Fn(i32) -> i32 {
    |x| |y| x + y
}

编译器告诉您:

error[E0562]: `impl Trait` not allowed outside of function and inherent method return types
 --> src/lib.rs:9:30
  |
9 | fn add2() -> impl Fn(i32) -> impl Fn(i32) -> i32 {
  |                              ^^^^^^^^^^^^^^^^^^^

根据impl Trait RFC,重点是我的:

  

impl Trait只能写在   独立的或固有的隐式函数,不在特征定义或   任何单向型位置。它们也可能不会出现在退货中   封闭特征或函数指针的类型,除非这些是   本身就是合法退货类型的一部分。

     
      
  • 最终,我们将希望允许在特征中使用该功能
  •   

闭包的返回类型是闭包特征的关联类型

pub trait FnOnce<Args> {
    type Output;
    extern "rust-call" fn call_once(self, args: Args) -> Self::Output;
}

另请参阅:

相关问题