向闭包传递变量

说明

默认情况下,闭包从环境中借用捕获。或者你可以用move闭包来将环境的所有权全给闭包。然而,一般情况下你是想传递一部分变量到闭包中,如一些数据的拷贝、传引用或者执行一些其他操作。

这种情况应在不同的作用域里进行变量重绑定。

示例

像这样

  1. use std::rc::Rc;
  2. let num1 = Rc::new(1);
  3. let num2 = Rc::new(2);
  4. let num3 = Rc::new(3);
  5. let closure = {
  6. // `num1` is moved
  7. let num2 = num2.clone(); // `num2` is cloned
  8. let num3 = num3.as_ref(); // `num3` is borrowed
  9. move || {
  10. *num1 + *num2 + *num3;
  11. }
  12. };

而不是

  1. use std::rc::Rc;
  2. let num1 = Rc::new(1);
  3. let num2 = Rc::new(2);
  4. let num3 = Rc::new(3);
  5. let num2_cloned = num2.clone();
  6. let num3_borrowed = num3.as_ref();
  7. let closure = move || {
  8. *num1 + *num2_cloned + *num3_borrowed;
  9. };

优点

这样在闭包定义的时候就把哪些是复制的数据搞清楚,这样结束时无论闭包有没有消耗掉这些值,都会及早drop掉。

闭包能用与上下文相同的变量名来用那些复制或者move进来的变量。

缺点

增加了闭包内的实现代码行数。