rust为什么需要闭包?

把闭包放到一个函数里面,为什么要如此多此一举?白白多一个作用域?
当然,它可以作为参数这点是很有意义,类似于C语言中的函数指针。它用得最多是什么场境下?

阅读 2.5k
2 个回答

我之前也在想,Rust 闭包函数好像没有什么意思,因为闭包函数并不能递归调用,而普通函数又需要手动传参数。

对于懒得手动传参这件事情请理解,没办法,JS 函数太自由了。

而多数时,闭包函数并不是单独存在的,而是直接当作参数,如 for_each()

fn main() {
    {
        fn log(v: i32) {
            println!("{}", v);
        }
        (0..5).for_each(log);
    }
    // 闭包形式,简洁
    {    
        (0..5).for_each(|v| println!("{}", v));
    }
}

可以观察到的是,使用闭包,就不需要先声明函数和声明参数了,而是直接使用即可。

当然,若是一个以变量形式存在的闭包函数,则可以公用化:

fn main() {
    let log = |v| println!("{}", v);
    {
        (0..5).for_each(log);
    }
    {
        (5..9).for_each(log);
    }
}

但并不是特别好使,因为闭包函数的参数会固定一种类型:

fn main() {
    let log = |v| println!("{}", v);
    {
        (0..9).for_each(log);
    }
    {
        // Error
        ('a'..'z').for_each(log);
    }
}

或许也会想说,这不就是 lambda 表达式嘛,没问题,这也是一个别称。

为了通用性, 有了一般函数为何还需要高阶函数, 有了高阶函数为什么还需要泛型.
想一想应该容易理解了, 就是为了减少模板代码应该是其中一个因素

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进